如何合并 OUTER JOIN 和 UNION 结果?

Posted

技术标签:

【中文标题】如何合并 OUTER JOIN 和 UNION 结果?【英文标题】:How do I merge OUTER JOIN and UNION results? 【发布时间】:2021-11-09 04:15:42 【问题描述】:

我有两个表,我想要两个表中的所有数据。 如果表具有匹配的 AssetID,则将它们连接到一行。如果没有,那么在单独的行上。 完全外连接听起来是正确的方法,但我在如何根据它来自哪个表来选择键时遇到问题。

TABLE A                 TABLE B
AssetID | Valuable      AssetID | Protected 
-------------------    -------------------
123     | Yes           123     | Yes   
456     | No            321     | No
653     | Yes   
        

目标:

TABLE C     
AssetID | Valuable | Protected
---------------------------
123 | Yes   |Yes
456 | No    |
653 | Yes   |
321 |       |No


SELECT TableA.AssetID, TableA.Valuable, TableB.Protected
FROM (
    SELECT AssetID, Valuable
    FROM TableA
) ta    
FULL OUTER JOIN (
    SELECT AssetID, Protected
    FROM TableB   
) tb ON ta.AssetID=tb.AssetID
    
    

生产

表 C

AssetID | Valuable | Protected
---------------------------
123     | Yes      |Yes
456     | No       |
653     | Yes      |
        |          |No              <<<< PROBLEM
---------------------------

我错过了钥匙

【问题讨论】:

注意:您发布的查询有语法错误,您将表别名为 tatb,但继续使用 TableA 和 TableB。 是的,一切都很好......这是伪代码,所以我没有仔细观察。 但是您要确保首先删除了所有错误,否则人们会浪费时间寻找错误的问题。 是的,我同意,并感谢您的建议。欣赏它。你们是巫师。 【参考方案1】:

您可以使用coalesce 从任何表中获取非空assetID

SELECT COALESCE(TableA.AssetID, TableB.AssetID) TableA.Valuable, TableB.Protected
FROM
(
SELECT 
    AssetID,
    Valuable
FROM 
    TableA
) ta

FULL OUTER JOIN 

(SELECT 
    AssetID,
    Protected
FROM 
    TableB

) tb

ON ta.AssetID=tb.AssetID

注意:不过,您可能不需要子查询,省略它们可以大大简化查询:

SELECT COALESCE(TableA.AssetID, TableB.AssetID) TableA.Valuable, TableB.Protected
FROM TableA
FULL OUTER JOIN TableB
ON TableA.AssetID=TableB.AssetID

【讨论】:

好的,这是一个很好的解决方案。如果有第二个条件,比如 LocationID,该怎么办?是否可以在 AssetID 和 LocationID 上合并? @Maxcot 你可以在你喜欢的任何列上使用合并... @Maxcot coalesce 接受参数列表并返回第一个非空参数。它们不必来自您加入的列,甚至根本不必来自列。你甚至可以做类似coalesce(tablea.assetid, tableb.locationid, 123)【参考方案2】:

为了处理 Null 值,我们使用 Coalesce 函数。或者,我们可以使用左连接后右连接来代替完全连接。

SELECT COALESCE(TABLEA.AssetID,TABLEB.AssetId) AS 
AssetId,TABLEA.Valuable,TABLEB.Protected
FROM TABLEA 
LEFT JOIN 
TABLEB ON TABLEA.AssetID = TABLEB.AssetID
UNION
SELECT COALESCE(TABLEA.AssetID,T1.AssetID) AS 
AssetID,TABLEA.Valuable,T1.Protected FROM TABLEA
RIGHT JOIN 
TABLEB T1 ON TABLEA.AssetID=T1.AssetID

【讨论】:

以上是关于如何合并 OUTER JOIN 和 UNION 结果?的主要内容,如果未能解决你的问题,请参考以下文章

left join ,right join ,inner join,outer join,union all,union有啥区别?怎么用?

SQLite3 使用 LEFT JOIN 和 UNION 模拟 RIGHT OUTER JOIN

模拟 FULL OUTER JOIN:LEFT+RIGHT JOIN 与交叉连接的 UNION 性能

MYSQL FULL OUTER JOIN - 使用 LEFT-UNION-LEFT JOIN 时的所有 NULL 结果

MySQL:FULL OUTER JOIN - 如何合并一列?

python-dataframe的合并(append, merge, concat, join)