本帖最后由 bjiokn 于 2009-12-28 10:28:17 编辑

解决方案 »

  1.   

    这样呢
    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是主键吧,你那么写已经很优化了
      

  2.   

    已经无法优化。如果你的empno是主键的话。
      

  3.   

    已经无法优化。如果你的empno是主键的话
      

  4.   

    update emp set (sal,comm)= 
      (select decode(empno,7499,sal),decode(empno,7654,comm) from emp empno=7369)
      

  5.   

    此问题,本人有另外的想法:此语句可以优化!
    你是更新的员工的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中的执行计划。楼主,明白了吗?