Oracle SQL Update

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, 0FROM 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
   );
努力到无能为力,奋斗到感动上天!
原文地址:https://www.cnblogs.com/lihao007/p/14546307.html