使用临时表更新多列,以避免临时表中的空值

时间:2012-10-11 20:25:59

标签: sql oracle sql-update

我想从Table1表更新Table2表中的多个列。临时表可能具有空值。我只想更新Table1表中有值的数据 - 而不是NULL值。

请咨询

e.g

Table 1                             Table 2
ID    col11   col2     col3         ID1      col1       col2       col3
3     test    xxxx     (null)       3        (null)   jjj        ffffff
5     (null)  yyyyy    zzzzzz       5        dddd     (null)     lllllllll

输出

ID      col1      col2      col3
3        test     xxxx      ffffff
5        dddd     yyyyy     zzzzzz

如果表1中的值为null,则表2中的值不应更新为null。

我现在的做法是

UPDATE  Table2 
SET ( col1 ,col2,col3)  
      =  (SELECT NVL(col1 ,col11), NVL(col2,col22), NVL(col3,col33)  
          FROM Test1  
          WHERE ID = ID1 )

1 个答案:

答案 0 :(得分:1)

使用COALESCE暂存值和现有目标值更新每列,假设列是相同或相似的类型。

在这个简单的情况下,这与NVL没有区别,尽管有一些differences值得了解,特别是可移植性,在更复杂的情况下,还有性能。

尽管对每个专栏进行技术更新似乎都是浪费,但事实并非如此。更新数据库行后,将产生成本。您可以使用动态SQL进行更复杂的查询,该动态SQL将执行多个更新,每个可能的列组合一个更新,但该解决方案将显着更慢,显然,更难维护。