2016-03-08 95 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