Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将多个表连接到桥接表,同时保留数据的两侧(包括空值)_Sql_Sql Server_Join_Mapping - Fatal编程技术网

Sql 将多个表连接到桥接表,同时保留数据的两侧(包括空值)

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

我有下表场景:

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