假设我有下表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)
);
这两个表A
和B
都会将code-id
个引用标记为another-table
,这与该问题无关。
是否可以编写一个可以一举识别的查询:
code-id
中有A
但B
中没有code-id
。B
中有A
但code-id
中没有A
。B
和code-name-1
中哪些code-name-2
相同,但left join
或right join
值不同(其中任何一个)。我相信这可以通过一个join
子句来解决,其结果连接到on
子句,其结果连接到第三个内部RESULT
子句,增强了两个ADDED
子句的字符串比较谓词。
我是否走在正确的轨道上?
我可以生成一个指定操作结果的附加列吗?例如。 REMOVED
列CHANGED
,join
,{{1}}?
是否有更聪明的方法来指定此查询,而不是必须连接三个{{1}}子句?
谢谢!
答案 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