Sql Server - FULL JOIN分割结果而不是返回已连接的数据集

时间:2017-12-06 04:51:03

标签: sql sql-server join

假设我在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

我猜/ 希望我只是错过了一些简单的事情,但我似乎无法让它发挥作用。什么是返回我想要的数据的最佳方式?

1 个答案:

答案 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;