表chw_1(id varchar2(2),a number(10)),
表chw_2(id varchar2(2),a number(10))
要求将chw_1对应chw_2 id的值相减后写入chw_1,即
chw_1.a=chw_1.a-chw_2.a where chw_1.id=chw_2.id
chw_1           chw_2
id,  a          id,   a
01   1          04,   2
02   2          02,   1
03   3          05,   5
sql1写法:
UPDATE chw_1 A SET a.a=(SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID) 得到结果chw_1的结果
chw_1           chw_2
id,  a          id,   a
01   null       04,   2
02   1          02,   1
03   null       05,   5
而sql2写法
UPDATE chw_1 A SET a.a=(SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID) where
exists(select 1 from chw_2 c where a.id=c.id)
得到结果chw_1的结果
chw_1           chw_2
id,  a          id,   a
01   1          04,   2
02   1          02,   1
03   3          05,   5为什么sql1,id=01,03得到的结果为null,而sql2是正确的呢?可以解释一下吗?感觉想不明白了。谢谢!

解决方案 »

  1.   

    sql1中,由于没有对更新chw_1加限制条件,致使要对chw_1表进行所有记录更新,当chw_1的ID在chw_2中没有对应时,则返回了NULL,这样就更改为NULL,可以变换加入条件为: UPDATE chw_1 A SET a.a=(SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID) 
    Where a.ID=b.ID
      

  2.   

    to_WangZWang(先来) 
    你的变换写法
    UPDATE chw_1 A SET a.a=(SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID) 
    Where a.ID=b.ID
    在oracle中是不支持的,会出现b.id invalid identifier
      

  3.   

    --改为:
    UPDATE chw_1 A SET a.a=nvl((SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID),a)
      

  4.   

    UPDATE chw_1 A SET a.a=(SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID) where
    exists(select 1 from chw_2 c where a.id=c.id)
    不加where exists(select 1 from chw_2 c where a.id=c.id)这个条件是更新所有的,a.id在B表中找不到的就被更新为null了,加上这个条件就是更新a.id在B表中能找到对应记录的记录。