我有类似的问题 这个堆叠的问题, ,除了我需要从比较中排除某些字段,但仍将其包括在结果集中。
我将问题作为当地对称的差异。

例如,表A和B具有X,Y,Z的列,我只想比较Y,z以获取差异,但我仍然希望结果设置为X。

有帮助吗?

解决方案

旧样式的SQL用于完整的连接 - 与B联合的A,不包括B中的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)

如果返回非零结果,则有差异。它不会告诉您它在哪个桌子,但这是一个开始。

其他提示

听起来这基本上是您想要的。匹配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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top