sql中的局部对称差异

时间:2010-08-25 00:32:29

标签: sql oracle symmetric-difference

我遇到与this StackOverflow question类似的问题,但我需要从比较中排除某些字段,但仍将其包含在结果集中。
我把问题写成局部对称差异。

例如表A和B有X,Y,Z列,我只想比较Y,Z的差异,但我仍然希望结果集包含X.

2 个答案:

答案 0 :(得分:2)

这听起来基本上就是你想要的。匹配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

答案 1 :(得分:0)

完整连接的旧样式SQL - 与B连接,不包括B中的行也在A(中间):

-- 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)

如果返回非零结果,则存在差异。它没有告诉你它在哪个表中,但它是一个开始。