将多个 table 连接到桥 table,同时保留数据的两侧(包括 NULL)
Joining multiple tables to a bridge table while keeping both sides of data (Including NULLs)
我有以下 table 场景:
Table答:
ID | Value
1 Apple
2 Orange
3 Banana
Table乙:
ID | Value
6 Sorbet
7 Ice Cream
Table C (Bridge/Mapping Table):
A_ID | B_ID
1 7
我想加入这些 table,这样我就可以从 table 的 A 和 B 中获取所有数据,而且还可以显示行之间存在映射(如果存在)。理想的解决方案 table 如下所示:
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
您将需要 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
我有以下 table 场景:
Table答:
ID | Value
1 Apple
2 Orange
3 Banana
Table乙:
ID | Value
6 Sorbet
7 Ice Cream
Table C (Bridge/Mapping Table):
A_ID | B_ID
1 7
我想加入这些 table,这样我就可以从 table 的 A 和 B 中获取所有数据,而且还可以显示行之间存在映射(如果存在)。理想的解决方案 table 如下所示:
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
您将需要 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