1.背景
工作中为了进行关联表更新,写了个SQL,测了测没什么问题,今天一跑,毁了。出GUB了。
2.该SQL实现的需求
A表中有名字为MM的字段,如果A表中的数据在M表中存在,MM字段就被更新成1,否则被更新成0。
表的关联条件为ACCOUNT_NO = ACCOUNT_NO
3.SQL如下
UPDATE A SET MM = ( SELECT NVL2(M.ACCOUNT_NO, 1, 0) FROM M WHERE A.ACCOUNT_NO = M.ACCOUNT_NO(+) );
读到这里的朋友,你可以想一下上面的sql哪里不对。(不要纠结sql语法,因为多表联合更新,各数据库sql写法不同)
(NVL2函数的意思是,如果第一个参数不是NULL,则返回第二参数的值,如果第一参数是NULL,则会返回第三个参数的值)
4.问题点
上述sql,执行之后的结果,A表和M表关联的数据可以被成功更新成1,这里没有问题。但是,A表和M表,没有关联上的部分,想定被更新成0,但是实际上被更新成NULL。
当时检查了NVL2函数,确认是否搞错了。又尝试了DECODE函数,均失败。
根据结果来反推,应该是,进行全表更新,匹配上的就按照取出的值进行更新,没匹配上的,就更新为NULL。但是为什么?本人惭愧。不知道原因,如果有知道的,望赐教
5.解决方案
UPDATE A SET MM = 1 WHERE EXISTS ( SELECT 1 FROM M WHERE A.ACCOUNT_NO = M.ACCOUNT_NO );