查找两个表之间的已修改/新建/已删除记录

hen*_*000 3 sql t-sql sql-server

我想通过将它与另一个表(tableB)进行比较,在一个表(tableA)中找到新的,已修改的和已删除的记录.两个表都具有相同的模式,并具有唯一的ID字段.

在我的情况下,tableA最初与tableB相同,但它已由一些外部组织编辑,一旦完成编辑,他们通过ZIP文件发回表,我们重新填充(截断并插入)该数据到TableA的.所以我想找出tableA中哪些记录发生了变化.我正在使用SQL Server 2012.

我可以使用"except"关键字获取新的和修改过的记录:

select * from tableA
except
select * form tableB
Run Code Online (Sandbox Code Playgroud)

(我们称之为上述结果)

我也可以删除和修改记录:

select * from tableB
except
select * form tableA
Run Code Online (Sandbox Code Playgroud)

(让我们称之为上述结果B)

问题是,ResultsA和ResultsB都具有相同的修改/编辑记录.因此修改/编辑的记录加倍.我可以在ResultsA和ResultsB上使用内部联接或交叉来获取修改后的记录(将此结果称为结果C).但后来我将需要再次ResultsA和ResultsC之间使用加入/除非得到公正的新的再ResultsB和ResultsC之间的记录,并加入/除非得到刚刚删除的记录......我想这个这个,但他们没有工作为了我.

显然这不好.有没有更优雅,更简单的方法来找出tableB中已删除,修改或添加的记录?

Bea*_*End 5

怎么样:

-- DELETED
SELECT B.*, 'DELETED' AS 'CHANGE_TYPE'
FROM TableB B
LEFT JOIN TableA A  ON B.PK_ID = A.PK_ID
WHERE A.PK_ID IS NULL
UNION
-- NEW
SELECT A.*, 'NEW'  AS 'CHANGE_TYPE'
FROM TableA  A
LEFT JOIN TableB  B ON B.PK_ID = A.PK_ID
WHERE B.PK_ID IS NULL
UNION
-- MODIFIED
SELECT B.*, 'MODIFIED'  AS 'CHANGE_TYPE'
FROM (
        SELECT * FROM TableA 
        EXCEPT
        SELECT * FROM TableB 
    ) S1
INNER JOIN TableB  B ON S1.PK_ID = B.PK_ID;
Run Code Online (Sandbox Code Playgroud)

不完全优雅,但它的工作原理.