第二条语句是对的。 第一条语句的问题出在NULL值的判断上,假如子查询中返回的有NULL,
 会将对应的a.字段1 更新为NULL  第二条语句因为加了exists判断,因此它只会更新匹配的行。

解决方案 »

  1.   

    update a set a.字段1=(select top 1 b.字段3 from b where a.字段2=b。字段4)
      

  2.   

    请问正确的写法到底是什么??小弟有一句 s ql2000要迁移到orcale, 温一下则么写??
    UPDATE T_CWSJ_YGXZHZ 
    SET JXXZ=JXXZ+b.TotalSum
    FROM T_CWSJ_YGXZHZ a,(SELECT RYID,SUM(YFS)  AS TotalSum ,ryfl FROM T_CWSJ_YGXZXX WHERE XZZL='QC02' AND ND=@ND AND YF=@YF GROUP BY RYID,ryfl) b
    WHERE a.RYID=b.RYID AND a.ND=@ND AND a.YF=@YF and a.ryfl=b.ryfl and a.ryfl=@ryfl@打头的都是过程中的变量 
      

  3.   

    移植几个注意的问题:
       1. 用动态SQL, 可以使用绑定变量,这样能提高效率.
          例如:       declare 
             v_sql varchar2(1000);
           begin
             v_sql := ’UPDATE tabelname SET colname = colvalue 
                       WHERE col1 = :1 and col2 =:2’; 
             EXECUTE IMMEDIATE v_sql USING col1,col2  ;
           end;     2. 注意判断NULL值,思路我在前面已经说了    3. 不用总是指望别人给你写出完整的SQL, 自己调试通过了不是很好吗?