zoukankan      html  css  js  c++  java
  • 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
       );
    努力到无能为力,奋斗到感动上天!
  • 相关阅读:
    PowerDesigner数据模型(CDM—PDM)
    Eclipse解决JSP页面乱码问题
    mysql中Access denied for user 'root'@'localhost' (using password:YES)
    PS小技巧
    sublime使用心得
    Java的变量命名
    Java栈和堆的区别
    Mac 快捷键
    用shell脚本监控进程是否存在 不存在则启动的实例
    linux怎么运行.SH文件
  • 原文地址:https://www.cnblogs.com/lihao007/p/14546307.html
Copyright © 2011-2022 走看看