假设我在SQL Server中设置了以下(非常简化的)架构/数据:
CREATE TABLE #Ids1 (Id1 VARCHAR(1));
CREATE TABLE #Vals1 (Id1 VARCHAR(1), Id2 VARCHAR(1));
CREATE TABLE #Ids2 (Id1 VARCHAR(1));
CREATE TABLE #Vals2 (Id1 VARCHAR(1), Id2 VARCHAR(1));
INSERT INTO #Ids1 (Id1) VALUES ('a'), ('b'), ('c'), ('d');
INSERT INTO #Vals1 (Id1, Id2) VALUES ('a', '1'), ('b', '2'), ('c', '3'), ('d', '4');
INSERT INTO #Ids2 (Id1) VALUES ('a'), ('b'), ('c'), ('e'), ('f'), ('g');
INSERT INTO #Vals2 (Id1, Id2) VALUES ('a', '1'), ('b', '2'), ('c', '3'), ('e', '5'), ('f', '6'), ('g', '7');
基本上,我有2个相似的数据集 - 一个以1
后缀结尾,另一个以2
后缀结尾,并且有可能任何一个数据集都可能包含不在另一套。
我想要做的是创建一个返回单个连接数据集的查询,该数据集如下所示:
#Ids1.Id1 #vals1.Id1 #vals1.Id2 #Ids2.Id1 #Vals2.Id1 #Vals2.Id2
a a 1 a a 1
b b 2 b b 2
c c 3 c c 3
d d 4 NULL NULL NULL
NULL NULL NULL e e 5
NULL NULL NULL f f 6
NULL NULL NULL g g 7
我认为以下SQL可以实现这一目标:
SELECT
*
FROM
#Ids1
FULL JOIN #Vals1
ON #Vals1.Id1 = #Ids1.Id1
FULL JOIN #Ids2
ON #Ids2.Id1 = #Ids1.Id1
FULL JOIN #Vals2
ON #Vals2.Id1 = #Ids2.Id1
AND #Vals2.Id2 = #Vals1.Id2
但是它将最后的表分开而不是加入它们,所以最终看起来如下:
#Ids1.Id1 #vals1.Id1 #vals1.Id2 #Ids2.Id1 #Vals2.Id1 #Vals2.Id2
a a 1 a a 1
b b 2 b b 2
c c 3 c c 3
d d 4 NULL NULL NULL
NULL NULL NULL e NULL NULL
NULL NULL NULL f NULL NULL
NULL NULL NULL g NULL NULL
NULL NULL NULL NULL e 5
NULL NULL NULL NULL f 6
NULL NULL NULL NULL g 7
我已在以下网址创建了指向准备好的Schema和SQL的链接: http://rextester.com/SAX53638
我猜/ 希望我只是错过了一些简单的事情,但我似乎无法让它发挥作用。什么是返回我想要的数据的最佳方式?
答案 0 :(得分:1)
尝试使用以下查询
SELECT
*
从
(SELECT
Ids1.Id1 AS Id11,
vals1.Id1 AS Idv11,
vals1.Id2 AS Idv12
从
IDS1
全加入Vals1
ON Vals1.Id1 = Ids1.Id1)Ivs1
完全加入
(SELECT
Ids2.Id1 AS Id21,
vals2.Id1 AS Idv21,
vals2.Id2 AS Idv22
从
IDS2
全加入Vals2
ON Vals2.Id1 = Ids2.Id1)Ivs2
ON Ivs1.Id11 = Ivs2.Id21;