2016-03-08 44 views
4

我想在另一個表上使用FULL OUTER JOIN的結果作爲FULL OUTER JOIN的表。我應該用什麼語法?多個完整外部聯接

對於例如:T1,T2,T3是我的表,列id,名稱。我需要這樣的東西:

T1 FULL OUTER JOIN T2 on T1.id = T2.id ==> Let this be named X 

X FULL OUTER JOIN T3 on X.id = t3.id 

我希望這可以實現,這樣在決賽條款,我希望T3.id要匹配T1.idT2.id。任何替代方法都可以。

回答

2
SELECT COALESCE(X.id,t3.id) AS id, *-- specific columns here instead of the * 
FROM 
    (
     SELECT COALESCE(t1.id,t2.id) AS id, * -- specific columns here instead of the * 
     FROM T1 FULL OUTER JOIN T2 on T1.id = T2.id 
    ) AS X 
    FULL OUTER JOIN T3 on X.id = t3.id 
+0

現在你有3個ID列在X .. – sagi

+0

@sagi Oooowkay,手和腳是。 –

+0

:PP,不意味着不高興 – sagi

1

你可以像你的建議,使用IN()

FROM T1 
FULL OUTER JOIN T2 
ON(T1.id = T2.id) 
FULL OUTER JOIN T3 
ON(T3.ID IN(T2.id,T1.id)) 

或者我認爲你可以使用UNION做(取決於你的需要):

SELECT * FROM 
    (SELECT name,id from T1 
    UNION 
    SELECT name,id from T2) x 
FULL OUTER JOIN T3 
    ON(t3.id = x.id) 
+0

當我用我得到這個錯誤():NotImplementedException:錯誤生成此查詢有效的執行計劃。沒有等連接謂詞的FULL OUTER JOIN類型只能用單個節點計劃執行。 – Abhishek

+0

您是否試圖運行它或在其上運行執行計劃?嘗試運行它首先@Abhishek – sagi

+0

我在Impala中運行查詢,導致此錯誤。 – Abhishek

0

通常,完全外連接的鏈條行爲並不像預期的那樣。一個替代品使用left join。當表格中包含所有您需要的ID時,此功能效果最佳。但是你也可以構造:

from (select id from t1 union 
     select id from t2 union 
     select id from t3 
    ) ids left join 
    t1 
    on ids.id = t1.id left join 
    t2 
    on ids.id = t2.id left join 
    t3 
    on ids.id = t3.id 

請注意,第一個子查詢通常可以用表替換。如果你有這樣一個表,你可以選擇where子句中的匹配行:

from ids left join 
    t1 
    on ids.id = t1.id left join 
    t2 
    on ids.id = t2.id left join 
    t3 
    on ids.id = t3.id 
where t1.id is not null or t2.id is not null or t3.id is not null