2010-08-25 17 views
0

我有一个类似于this StackOverflow question的问题,除了我需要从比较中排除某些字段,但仍将其包含在结果集中。
我将这个问题视为局部对称差异。sql中的局部对称差异

例如表A和B具有列X,Y,Z,我想比较只有Y,Z的差异,但我还是希望结果集中包括X.

+1

实例数据与预期输出请 – 2010-08-25 00:44:02

回答

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) 

如果返回非零结果,则是有区别的。它不会告诉你它在哪个表中,但它是一个开始。

+1

这最后的查询也将返回如果0 'one_of_the_tables'包含'the_other_table'中的一部分数据。您需要在两个方向上执行MINUS以测试数据集是否完全相同。 – 2010-08-25 13:22:20

+0

@Dave Costa - 您是对的,先生。答案已更正。 – 2010-08-25 17:08:28

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