2017-02-09 10 views
1

コードジョイン:T-SQL(?クロス)

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]フィールドに基づいて3つのテーブルを結合することを(」 「キー列」)、所望の出力を に作成します。レコードが2つのテーブルのみに存在する場合は、他のテーブルのフィールドには を返します。つまり、ID = 3および4レコード があるテーブルに存在し、他のテーブルに存在しない場合は、他のテーブルのNULLを返します。 フィールド) - すなわちID = 1,2、および5

実際のデータセットはかなり大きいので、クエリは高速で実行しなければならず、 ははるかに複雑です。

はあなたがCROSSが参加するのではなく、参加FULLたい、これまで..

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] 

答えて

3

を試してみてくださいマイ。あなたが使用することができます

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) 
+0

T3からID 5を追加することができないであろうこのクエリの –

+3

に参加しかしない:) LEFTに参加CROSSのではなく、参加残しました。 –

+0

Perfecto!グラシア・アミーゴ〜 – 007