我有下表场景:
表A:
ID | Value
1 Apple
2 Orange
3 Banana
表B:
ID | Value
6 Sorbet
7 Ice Cream
表 C(桥/映射表):
A_ID | B_ID
1 7
我想要连接这些表,以便从表 A 和 B 中获取所有数据,同时还显示行之间存在映射(如果存在)。理想的解决方案表如下所示:
A_ID | A_Value | Mapped? | B_ID | B_Value
1 Apple Yes 7 Ice Cream
2 Orange No NULL NULL
3 Banana No NULL NULL
NULL NULL No 6 Sorbet
到目前为止,我已经使用 LEFT JOIN 和 RIGHT JOIN 尝试了很多方法,但是无论如何,我都无法获得包含桥两侧数据的连接结构。
这个查询是我认为可以工作的,但它仍然删除了许多未从我的结果映射的行:
select a.A_ID, a.Value, b.B_ID, b.Value
from
(Select * from TableA left join TableC on TableA.ID = TableC.A_ID) a
JOIN
(Select * from TableB left join TableC on TableB.ID = TableC.B_ID) b
on a.A_ID = b.A_ID and a.B_ID = b.B_ID
最佳答案
结合使用LEFT JOIN
和FULL OUTER JOIN
可以达到所需的输出:
SELECT A.ID AS A_ID,
A.Value AS A_Value,
CASE WHEN C.A_ID IS NOT NULL THEN 'Yes'
ELSE 'No'
END AS Mapped,
B.ID AS B_ID,
B.Value AS B_Value
FROM @TableA A
LEFT JOIN @TableC C ON C.A_ID = A.ID
FULL OUTER JOIN @TableB B ON B.ID = C.B_ID;
A_ID A_Value Mapped B_ID B_Value
1 Apple Yes 7 Ice Cream
2 Orange No NULL NULL
3 Banana No NULL NULL
NULL NULL No 6 Sorbet
关于sql - 将多个表连接到桥接表,同时保留两侧数据(包括 NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949265/