代码:
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]
答案 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)