2012-10-11 85 views
2

我想從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 

它不應該更新表2的值,如果表1中值爲null將空。

我的做法,現在是

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

回答

1

更新與升級價值的COALESCE每一列和現有的目標值,假設列是相同或相似的類型。

在這種簡單的情況下,這與NVL沒有什麼不同,儘管有一些differences值得了解,尤其是便攜性,在更復雜的情況下,性能。

雖然看起來每個專欄在技術上更新可能看起來很浪費,但事實並非如此。一旦更新數據庫行,就會產生成本。您可以使用動態SQL進行更復雜的查詢,該查詢可以執行多個更新,每個可能的列組合都有一個更新,但是該解決方案會顯着較慢,顯然更難以維護。