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中已删除,修改或添加的记录?
怎么样:
-- 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)
不完全优雅,但它的工作原理.
| 归档时间: |
|
| 查看次数: |
5639 次 |
| 最近记录: |