Sql 将多个表连接到桥接表,同时保留数据的两侧(包括空值)
我有下表场景: 表A:Sql 将多个表连接到桥接表,同时保留数据的两侧(包括空值),sql,sql-server,join,mapping,Sql,Sql Server,Join,Mapping,我有下表场景: 表A: ID | Value 1 Apple 2 Orange 3 Banana 表B: ID | Value 6 Sorbet 7 Ice Cream 表C(桥梁/映射表): 我希望连接这些表,以便从表A和表B中获取所有数据,但如果行之间存在映射,则还需要显示映射。理想溶液表如下所示: A_ID | A_Value | Mapped? | B_ID | B_Value 1 Apple Yes 7 Ice
ID | Value
1 Apple
2 Orange
3 Banana
表B:
ID | Value
6 Sorbet
7 Ice Cream
表C(桥梁/映射表):
我希望连接这些表,以便从表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
到目前为止,我已经尝试了许多使用左连接和右连接的方法,但是我无法获得一个连接结构来工作,因为它在桥的两侧都包含数据
我认为该查询可以工作,但它仍然删除了许多未从结果中映射的行:
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
混合使用
左连接
和全外连接
可以达到所需的输出:
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;
您将需要2个完整的外部联接:
select
a.ID as A_ID,
a.Value as A_Value,
case when
(a.id=c.a_id and c.b_id=b.id)
then 'yes'
else 'no'
END as Mapped ,
b.ID as B_ID,
b.Value as B_value
from tableA a full outer join tableC c on a.id=c.a_id
full outer join tableB b on c.b_id=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
看看完整的外部连接完整的外部连接似乎是我一直在寻找的解决方案。请随意将其作为答案发布,我会标记它,谢谢!伟大的我不能给你回信了。如果其他人的答案解决了问题,那么请随意接受他们的答案:)
select
a.ID as A_ID,
a.Value as A_Value,
case when
(a.id=c.a_id and c.b_id=b.id)
then 'yes'
else 'no'
END as Mapped ,
b.ID as B_ID,
b.Value as B_value
from tableA a full outer join tableC c on a.id=c.a_id
full outer join tableB b on c.b_id=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