关于ORACLE 数据库连表更新的问题

大神好,

我的问题是,下面的sql语句为什么除了会更新 S.CODE = T.CODE条件的数据, 还会更新全表的数据,
并且全部更新为 null了,什么原因?

-- 更新当月的 TYPE_CODE 和 TYPE_TXT

UPDATE TABLE_1 T
 SET (T.TYPE_CODE, T.TYPE_TXT) =
   (SELECT S.TYPE_CODE, S.TYPE_TXT
      FROM TABLE_2 S
     WHERE S.CODE = T.CODE)
WHERE T.MONTH = TRUNC(SYSDATE, 'MM');
阅读 3.1k
1 个回答

你这种写法,如果在TABLE_2 中找不到T.CODE对应的记录,SET赋值语句中右边的SQL会返回NULL,所以TABLE_1中的字段就变成NULL了。
如果想避免这种情况,可以在UPDATE的WHERE中增加一个限制条件:

UPDATE TABLE_1 T
 SET (T.TYPE_CODE, T.TYPE_TXT) =
   (SELECT S.TYPE_CODE, S.TYPE_TXT
      FROM TABLE_2 S
     WHERE S.CODE = T.CODE)
WHERE T.MONTH = TRUNC(SYSDATE, 'MM') AND
EXISTS(SELECT 1 FROM TABLE_2 WHERE TABLE_2 .CODE = T.CODE)