gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:11:30 26 4
gpt4 key购买 nike

我想通过将一个表 (tableA) 与另一个表 (tableB) 进行比较来查找新的、修改的和删除的记录。两个表具有相同的模式并具有唯一的 ID 字段。

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

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

select * from tableA
except
select * form tableB

(我们把上面的结果称为ResultA)

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

select * from tableB
except
select * form tableA

(我们把上面的结果称为ResultB)

问题是,ResultsA 和 ResultsB 都有相同的记录已被修改/编辑。所以修改/编辑的记录加倍。我可以在 ResultsA 和 ResultsB 上使用内部连接或相交来获取 仅修改后的记录(称为结果 ResultsC)。但是我需要在 ResultsA 和 ResultsC 之间再次使用 join/except 来获取 新的 记录,并在 ResultsB 和 ResultsC 之间再次使用 join/except 来获取 刚刚删除的记录...我试过thisthis但它们不适合我。

显然这不好。有没有什么更优雅、更简单的方法可以找出tableA和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;

不是很优雅,但它确实有效。

关于sql - 在两个表之间查找修改/新建/删除的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com