跟踪两个SQL表之间的差异(添加,删除,更改)

时间:2014-06-20 20:34:23

标签: sql join difference

假设我有下表A

create table A (
    code-id integer primary key,
    code-name-1 varchar(200) not null,
    code-name-2 varchar(200) not null,
    foreign key (code-id) references another-table(code-id)
);

还有一张表B

create table B (
    code-id integer primary key,
    code-name-1 varchar(200) not null,
    code-name-2 varchar(200) not null,
    foreign key (code-id) references another-table(code-id)
);

这两个表AB都会将code-id个引用标记为another-table,这与该问题无关。

是否可以编写一个可以一举识别的查询:

  • code-id中有AB中没有code-id
  • B中有Acode-id中没有A
  • Bcode-name-1中哪些code-name-2相同,但left joinright join值不同(其中任何一个)。

我相信这可以通过一个join子句来解决,其结果连接到on子句,其结果连接到第三个内部RESULT子句,增强了两个ADDED子句的字符串比较谓词。

  • 我是否走在正确的轨道上?

  • 我可以生成一个指定操作结果的附加列吗?例如。 REMOVEDCHANGEDjoin,{{1}}?

  • 是否有更聪明的方法来指定此查询,而不是必须连接三个{{1}}子句?

谢谢!

2 个答案:

答案 0 :(得分:1)

在A但不在B

Select code-id from A
Except
Select code-id from B

在B但不在A

Select code-id from B
Except
Select code-id from A

在A和B中

Select code-id from A
Intersect
Select code-id from B

作为单个查询,您应该能够将它们联合起来

Select code-id from A
    Except
    Select code-id from B
UNION
Select code-id from B
    Except
    Select code-id from A
UNION
Select code-id from A
    Intersect
    Select code-id from B

答案 1 :(得分:1)

你可以使用EXCEPT操作数和一个像这样的连接

Select code-id, 'added' result from a
Except
Select code-id, 'added' result from b
Union all
Select code-id, 'removed' result from b
Except
Select code-id, 'removed' result from a
Union all
Select code-id, 'changed' result 
from a join b on a.code-id = b.code-id 
Where a.code-name-1 != b.code-name-1 or a.code-name-2 != b.code-name-2