我想加入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
我该如何实现?没有可以将这些表绑定到的唯一标识符
答案 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;