sql - 将多个表连接到桥接表,同时保留两侧数据(包括 NULL)

标签 sql sql-server join mapping

我有下表场景:

表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 JOINFULL 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;

Working example

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/

相关文章:

c# - EF 6 与 EF 5 部署到 IIS8 时的相对性能问题

sql - JOIN on 集合返回函数结果

mysql - 列出左表中的所有值

针对 Excel 电子表格的 SQL 查询

sql - 使用 Google Analytics 导出的数据在 BigQuery 中进行队列/保留查询

php - 如何将不同部分的用户统计信息存储在数据库(mysql)中?

mysql - 多个表的内部连接,计数和不同

mysql - MySql 中的内存表和临时表

c# - SQLCLR:如何将程序集 Npgsql.dll 添加到数据库?

postgresql - 如何在 Postgresql 中水平组契约(Contract)一个表上的两个选择查询?