关于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');
阅读 3k
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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进