2012-09-14 63 views
1

我有這樣一個表:的Oracle SQL - 避免遞歸相關更新

A 
ID_A ID_1 ID_2 
1  1  (null) 
2  3  (null) 
3  7  (null) 

B 
ID_B ID_1 ID_2 
1  (null) 2 
2  (null) 4 
3  (null) 6 

REF  
ID_A ID_B 
1  2 
3  1 

根據裁判表,爲2的ID_A的對象是相同的對象的1

一個ID_B

所以,我應該能夠更新表是這樣的:

A 
ID_A ID_1 ID_2 
1  1  4 
2  3  (null) 
3  7  2 

事實上,你如果這樣做,查詢得到這一結果

select 
    A.ID_A, B.ID_1, C.ID_2 
from 
    A, B, REF 
where 
    A.ID_A = REF.ID_A 
    AND REF.ID_B = B.ID_B 

(其實你失去了空行,因爲它是一個內部聯接,但是這不是問題的關鍵。)

什麼我完全無法做的是更新這一新的信息!我要麼獲得「單行子查詢返回多行」更新或可愛的結果,我的查詢是非確定性的合併。

鑑於我確實擁有三張表格,正如我所展示的那樣,如何編寫查詢來正確更新id_2? ;

+0

什麼C.ID_2在查詢? (C不在從句中) – tbone

回答

2
merge into A w 
using(select a.id_a 
      , b.id_2 
     from a 
     join rf on (a.id_a = rf.id_a) 
     join b on (b.id_b = rf.id_b) 
    ) q 
    on (q.id_a = w.id_a) 
when matched then 
    update 
    set w.id_2 = q.id_2 

SQL Fiddle

+0

謝謝。我有這樣的東西,但它沒有工作。我在dB中運行了相同的代碼,發現它的確如此,並最終意識到這是因爲我的使用子句返回了我認爲是「非確定性」行爲的重複項,而不是查詢的遞歸性質。 – Jeremy