SQL连接2个表以查看差异

时间:2018-08-16 20:27:26

标签: sql

我想加入2个表,以轻松查看它们之间的差异,并按一列(类型)中指定的节划分。 举个例子:

表1:

Type1|Data1
Type1|Data2
Type2|Data3

表2:

Type1|Data1
Type2|Data5
Type2|Data6

预期结果:

Type1|Data1|Type1|Data1
Type1|Data2|null|null
Type2|Data3|Type2|Data5
null |null|Type2|Data6

我该如何实现?没有可以将这些表绑定到的唯一标识符

2 个答案:

答案 0 :(得分:1)

我认为您想枚举值,然后使用full join

select t1.type, t1.data, t2.type, t2.data
from (select t1.*, row_number() over (partition by type order by type) as seqnum
      from t1
     ) t1 full join
     (select t2.*, row_number() over (partition by type order by type) as seqnum
      from t2
     ) t2
     on t1.type = t2.type and t1.seqnum = t2.seqnum;

答案 1 :(得分:0)

假设源表中的值都不是NULL,则可以在所有列上使用FULL JOIN

SELECT *
       FROM table1 t1
            FULL JOIN table2 t2
                      ON t1.column1 = t2.column1
                         AND t1.column2 = t2.column2;

存储在两个表中的所有值对将在一行中重复。如果一个表中存在一对,但另一个表中不存在,则另一个表的值将为NULL

要仅查看不同的行,可以将其细化为:

SELECT *
       FROM table1 t1
            FULL JOIN table2 t2
                      ON t1.column1 = t2.column1
                         AND t1.column2 = t2.column2
       WHERE t1.column1 IS NULL
             OR t2.column1 IS NULL;

那应该使您能够看到差异。但这不会产生您的“ Type2|Data3|Type2|Data5”行。我不知道该行背后的逻辑是什么?也许只是按照The Impaler的评论加入column1会使您更接近这一点,尽管它不会产生与发布的数据一起发布的预期结果。

SELECT *
       FROM table1 t1
            FULL JOIN table2 t2
                      ON t1.column1 = t2.column1;