2013-11-14 24 views
2

問題Oracle SQL - 如何從外連接表中更新?

我需要編寫一個更新查詢,其中我的SET引用外部聯接的表。

我可以用SQL Server很容易地做到這一點,但我有一段時間搞清楚Oracle中的語法,因爲我只允許在更新查詢中使用單個表。

我寫了下面的Oracle查詢:

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
       FROM dw_sls_rep_conv sls 
       WHERE sls.aims_rep = tmp.slsrep) 
WHERE EXISTS (SELECT three_dig_rep 
       FROM dw_sls_rep_conv sls 
       WHERE sls.aims_rep = tmp.slsrep) 
      AND tmp.sysind = 'AIM'; 

這需要交集的照顧,但我需要應對SalesExt_tmp沒有在dw_sls_rep_conv相當於匹配值(我打算添加一個case語句將空值設置爲默認值)。爲此,我需要將dw_sls_rep_conv設置爲外部聯接表。但這是我陷入困境的地方。

的SQL Server實例

在SQL Server中的解決方案是一塊蛋糕,你可以在更新查詢多個表:

UPDATE SalesExt_tmp tmp 
LEFT JOIN dw_sls_rep_conv sls ON sls.aims_rep = tmp.slsrep 
SET tmp.slsrep = sls.three_dig_rep 
WHERE tmp.sysind = 'AIM'; 

但我不能爲生命我想出瞭如何在Oracle中做到這一點。我知道這個查詢將允許我的slsrep字段在某些情況下被設置爲NULL,這使我擔心這個操作可能不被允許。

問題

1)首先這是可能在Oracle中? (它應該是吧?)

2)我該如何重組我的查詢來解決這個問題?我猜我的WHERE EXISTS子句需要去...但我仍然堅持要在哪裏放置我的JOIN。

回答

3

如果我正確地理解了你,如果在dw_sls_rep_conv表中沒有匹配,你希望將該值設置爲NULL?如果是的話,就放棄你EXISTS狀況和所有行會被更新:

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
       FROM dw_sls_rep_conv sls 
       WHERE sls.aims_rep = tmp.slsrep) 
WHERE tmp.sysind = 'AIM'; 

如果在dw_sls_rep_conv表匹配,則slsrep列將選定的值進行更新,否則,與NULL

+0

哇哦....那是那麼容易!這正是我想要做的......謝謝!我仍然試圖讓我的大腦圍繞着SQL Server和Oracle Update查詢之間的邏輯差異。但我現在知道這是如何工作的......我的WHERE條件設置了要更新的內容,我的SET定義了要更新的值。兩者之間的任何差異都將設置爲空。 – DanK

2

你有你的where子句執行外使用子查詢聯接認爲,你說這樣的:

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
FROM dw_sls_rep_conv sls WHERE sls.aims_rep = tmp.slsrep)  
WHERE 
tmp.rowid in 
(SELECT tmp1.rowid 
FROM SalesExt_tmp tmp1, 
     dw_sls_rep_conv sls 
WHERE 
tmp1.slsrep = sls.aims_rep (+) 
AND tmp1.sysind = 'AIM'); 
+0

謝謝,我在發佈後不久就開始探索這條道路,而且這個方法的效果肯定不錯,儘管效率不高。感謝帖子! – DanK