Max*_*cot 0 sql t-sql sql-server select full-outer-join
我有两个表,我想要两个表中的所有数据。如果表具有匹配的 AssetID,则将它们连接到一行。如果没有,则在单独的行上。完整的外部联接听起来像是正确的方法,但我在如何根据它来自哪个表来选择键方面遇到了问题。
TABLE A TABLE B
AssetID | Valuable AssetID | Protected
------------------- -------------------
123 | Yes 123 | Yes
456 | No 321 | No
653 | Yes
Run Code Online (Sandbox Code Playgroud)
目标:
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
Run Code Online (Sandbox Code Playgroud)
生产
表C
AssetID | Valuable | Protected
---------------------------
123 | Yes |Yes
456 | No |
653 | Yes |
| |No <<<< PROBLEM
---------------------------
Run Code Online (Sandbox Code Playgroud)
我丢了钥匙
您可以使用从任何表中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
Run Code Online (Sandbox Code Playgroud)
注意:不过,您可能不需要子查询,省略它们可以大大简化查询:
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
Run Code Online (Sandbox Code Playgroud)