这样呢 update emp set (sal,comm)= (select max(decode(empno,7499,sal)),max(decode(empno,7654,comm)) from emp where empno in(7499,7654)) where empno=7369empno是主键吧,你那么写已经很优化了
已经无法优化。如果你的empno是主键的话。
已经无法优化。如果你的empno是主键的话
update emp set (sal,comm)= (select decode(empno,7499,sal),decode(empno,7654,comm) from emp empno=7369)
此问题,本人有另外的想法:此语句可以优化! 你是更新的员工的sal等于empno为7499,comm等于empno为7654的。如果以上条件都是在以后不变,也就是说,今后你的更新都是更新empno=7369 的员工的sal等于empno为7499,comm等于empno为7654,那么可以说没有什么优化的必要了 但是,如果你是想在今后不是更新empno=7369的信息,而是其他的如empno=1234,这样的话,就有优化的方法。具体做法是使用绑定变量的形式: update emp set sal=(select sal from emp where empno:=empno_2), comm=(select comm from emp where empno:=empno_3) where empno:=empno_1; 因为这样做,SQL语句无论更新那个empno的资料,SQL语句都是一样的,Oracle解析SQL语句就会提高,此SQL语句只需第一次更新就会将解析树和执行计划以及优化方案放入cache中,以后再更新其他的,就不需要再硬解析SQL语句了,直接用cache中的执行计划。楼主,明白了吗?
update emp set (sal,comm)=
(select max(decode(empno,7499,sal)),max(decode(empno,7654,comm)) from emp where empno in(7499,7654))
where empno=7369empno是主键吧,你那么写已经很优化了
(select decode(empno,7499,sal),decode(empno,7654,comm) from emp empno=7369)
你是更新的员工的sal等于empno为7499,comm等于empno为7654的。如果以上条件都是在以后不变,也就是说,今后你的更新都是更新empno=7369 的员工的sal等于empno为7499,comm等于empno为7654,那么可以说没有什么优化的必要了
但是,如果你是想在今后不是更新empno=7369的信息,而是其他的如empno=1234,这样的话,就有优化的方法。具体做法是使用绑定变量的形式:
update emp set sal=(select sal from emp where empno:=empno_2),
comm=(select comm from emp where empno:=empno_3)
where empno:=empno_1;
因为这样做,SQL语句无论更新那个empno的资料,SQL语句都是一样的,Oracle解析SQL语句就会提高,此SQL语句只需第一次更新就会将解析树和执行计划以及优化方案放入cache中,以后再更新其他的,就不需要再硬解析SQL语句了,直接用cache中的执行计划。楼主,明白了吗?