2016-12-16 61 views
0

使用Oracle外連接語法進行拼圖。使用Oracle外連接鏈接多個表

我們有這個查詢內部和外部連接;

SELECT A.aa, B.bb, C.cc, D.dd 
FROM 
    TABLEA A, TABLEB B, TABLEC C, TABLED D 
WHERE 
    A.XX = B.XX AND 
    B.YY = C.YY AND 
    C.ZZ = D.WW (+) 

該查詢工作正常。現在有可能改變表A和B(XX)之間的鏈接可能不存在。

所以我們想變成一個外此連接返回數據,而不管現有的連接是否滿足或有A和B(以及其他表)之間沒有任何聯繫。

你怎麼能做到這一點?

+1

這是寫這個的老辦法,看在使用JOIN命令。 – Chuck

+0

假設您在A中沒有鏈接到B,而在B,C,D中的行連接在一起,但是沒有與A連接。您是否想從A中抽取唯一的一行? – Aleksej

+0

是單排只有一個細節。其他表中的值將爲空。 –

回答

3

說你有你的表如下所示:

insert into tableA values (1); 
insert into tableA values (2); 
insert into tableB values (1, 10); 
insert into tableB values (-2, 20); 
insert into tableC values (10, 100); 
insert into tableC values (20, 200); 
insert into tableD values (200); 
insert into tableD values (999); 

如果我沒有理解好,你需要在外部連接即使在B和C,不僅d使用;在老的Oracle語法是這樣的:

SELECT * 
FROM 
    TABLEA A, TABLEB B, TABLEC C, TABLED D 
WHERE 
    A.XX = B.XX(+) AND 
    B.YY = C.YY(+) AND 
    C.ZZ = D.WW (+) 

而且在(更好)ANSI SQL:

select * 
from tableA A 
     left outer join 
    tableB B on (A.xx = B.xx) 
     left outer join 
    tableC C on (B.yy = C.yy) 
     left outer join 
    tableD D on (C.zz = D.ww) 

他們都給予:

 XX   XX   YY   YY   ZZ   WW 
---------- ---------- ---------- ---------- ---------- ---------- 
     2 
     1   1   10   10  100 
+0

謝謝。只有評論是,如果A和B之間存在鏈接,那麼我們保證在B和C之間有一個鏈接,這樣就不需要在外面。 C和D不保證鏈接,因此需要外部。 –

+0

@MarcusLeon不要忘了標記他的答案是正確的,如果它是,或至少upvote,如果它是有幫助的! – Kateract

+0

會做。我將在接下來的幾天對此進行一些測試,看看它是否適合我。 –