表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是正确的呢?可以解释一下吗?感觉想不明白了。谢谢!
表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是正确的呢?可以解释一下吗?感觉想不明白了。谢谢!
Where a.ID=b.ID
你的变换写法
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
UPDATE chw_1 A SET a.a=nvl((SELECT a.A-b.A FROM chw_2 b WHERE a.ID=b.ID),a)
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表中能找到对应记录的记录。