sql中的局部对称差分
我有一个与类似的问题,只是我需要从比较中排除某些字段,但仍将其包括在结果集中。sql中的局部对称差分,sql,oracle,symmetric-difference,Sql,Oracle,Symmetric Difference,我有一个与类似的问题,只是我需要从比较中排除某些字段,但仍将其包括在结果集中。 我把这个问题写成局部对称差分 例如,表A和B有X、Y、Z列,我只想比较Y、Z的差异,但我仍然希望结果集包括X。用于完全联接的旧式SQL-A与B连接,不包括B中的行以及A(中间): ANSI样式: select coalesce(a.x, b.x) as x, coalesce(a.y, b.y) as y, a.z from a full outer join b
我把这个问题写成局部对称差分
例如,表A和B有X、Y、Z列,我只想比较Y、Z的差异,但我仍然希望结果集包括X。用于完全联接的旧式SQL-A与B连接,不包括B中的行以及A(中间): 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)
如果它返回一个非零的结果,那么就存在差异。它不会告诉您它在哪个表中,但这只是一个开始。用于完全联接的旧式SQL—a与B连接,不包括B中的行以及a(中间)中的行: 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)
如果它返回一个非零的结果,那么就存在差异。它不会告诉你它在哪个表中,但这只是一个开始。听起来这基本上就是你想要的。匹配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
听起来这基本上就是你想要的。匹配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
示例数据和预期输出请示例数据和预期输出请如果
一个\u表
包含另一个\u表中的数据子集,则最后一次查询也将返回0。您需要在两个方向上进行减号,以测试数据集是否完全相同。如果一个\u表
包含另一个\u表中的数据子集,则最后一个查询也将返回0。您需要在两个方向上进行减号,以测试数据集是否完全相同。