我有两张桌子,我想要两个表中的所有数据。如果表具有匹配的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
---------------------------我错过了钥匙
发布于 2021-09-13 23:10:33
您可以使用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发布于 2021-09-14 12:08:16
为了处理Null值,我们使用了合并函数。或者,代替完全连接,我们可以使用左连接,然后右连接。
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.AssetIDhttps://stackoverflow.com/questions/69169987
复制相似问题