如何合并 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
---------------------------
我错过了钥匙
【问题讨论】:
注意:您发布的查询有语法错误,您将表别名为ta
和 tb
,但继续使用 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 你可以在你喜欢的任何列上使用合并... @Maxcotcoalesce
接受参数列表并返回第一个非空参数。它们不必来自您加入的列,甚至根本不必来自列。你甚至可以做类似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 结果