我有一个类似于这个 StackOverflow question的问题,除了我需要从比较中排除某些字段但仍将其包含在结果集中。
我将问题描述为局部对称差异。
例如,表 A 和 B 有 X、Y、Z 列,我只想比较 Y、Z 的差异,但我仍然希望结果集包含 X。
我有一个类似于这个 StackOverflow question的问题,除了我需要从比较中排除某些字段但仍将其包含在结果集中。
我将问题描述为局部对称差异。
例如,表 A 和 B 有 X、Y、Z 列,我只想比较 Y、Z 的差异,但我仍然希望结果集包含 X。
听起来这基本上就是你想要的。在 Y 列和 Z 列上匹配两个表之间的行,找到不匹配的行,并输出 X、Y 和 Z 列的值。
SELECT a.x, a.y, a.z, b.x, b.y, b.z
FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
WHERE a.y IS NULL OR b.y IS NULL
用于完全连接的旧式 SQL - A 与 B 连接,不包括 A 中的 B 中的行(中间):
-- all rows in A with or without matching B
select a.x, a.y, a.z
from a
left join b
on a.x = b.x
and a.y = b.y
union all
-- all rows in B with no match in A to "exclude the middle"
select b.x, b.y, null as z
from b
where not exists (select null
from a
where b.x = a.x
and b.y = a.y)
ANSI 风格:
select coalesce(a.x, b.x) as x,
coalesce(a.y, b.y) as y,
a.z
from a
full outer join b
on a.x = b.x
and a.y = b.y
聚结的存在是为了安全;我实际上从来没有理由在现实世界中编写完整的外部连接。
如果您真的想知道两个表是否相同,方法如下:
SELECT COUNT(*)
FROM (SELECT list_of_columns
FROM one_of_the_tables
MINUS
SELECT list_of_columns
FROM the_other_table
UNION ALL
SELECT list_of_columns
FROM the_other_table
MINUS
SELECT list_of_columns
FROM one_of_the_tables)
如果返回非零结果,则存在差异。它不会告诉你它在哪张桌子上,但它是一个开始。