T-SQL(交叉?)加入

时间:2017-02-09 17:27:55

标签: sql-server tsql sql-server-2014

代码:

DECLARE @T1 TABLE (ID INT, Val1 VARCHAR(25), Val2 VARCHAR(25));
DECLARE @T2 TABLE (ID INT, Val3 BIT);
DECLARE @T3 TABLE (ID INT, Val4 DECIMAL(18,6));

INSERT INTO @T1 ( [ID], [Val1], [Val2] )
VALUES  ( 1, 'V1One','V2One' )
        ,(2, 'V1Two','V2Two' )
        ,(3, 'V1Three','V2Three' )
        ,(4, 'V1Four','V2Four' );

INSERT INTO @T2 ( [ID], [Val3] )
VALUES  ( 3, 1 );

INSERT INTO @T3 ( [ID], [Val4] )
VALUES  ( 4, 9.99 )
        ,( 5, 0.99 );

期望的输出:

ID  Val1    Val2    Val3    Val4
1   V1One   V2One   NULL    NULL
2   V1Two   V2Two   NULL    NULL
3   V1Three V2Three 1       NULL
4   V1Four  V2Four  NULL    9.990000
5   NULL    NULL    NULL    0.99

目标:

  

根据[ID]字段(“键列”)组合三个表并创建   期望的输出。如果记录仅存在于两个表中,则返回   其他表的字段为NULL - 即ID = 3和4如果是记录   存在于一个表中但不存在于其他表中,为其他表返回NULL   字段 - 即ID = 1,2和5

     

查询必须快速执行,因为真正的数据集非常庞大   更复杂。

我的尝试到目前为止..

SELECT COALESCE([T1].[ID],[T2].[ID],[T3].[ID]), Val1, Val2, Val3, Val4 
FROM @T1 T1
CROSS JOIN @T2 T2 
CROSS JOIN @T3 T3
--WHERE T1.[ID] = T2.[ID]
--WHERE T1.[ID] = T3.[ID]

1 个答案:

答案 0 :(得分:3)

您想要完全加入,而不是CROSS加入。

SELECT COALESCE([T1].[ID],[T2].[ID],[T3].[ID]), Val1, Val2, Val3, Val4 
FROM T1 T1
FULL JOIN @T2 T2 ON T2.ID = T1.ID
FULL JOIN @T3 T3 ON T3.ID = COALESCE(T1.ID, T2.ID)