gpt4 book ai didi

sql-server - 删除重复行同时更新关系

转载 作者:行者123 更新时间:2023-12-03 23:52:48 26 4
gpt4 key购买 nike

我的数据设置如下:

CREATE TABLE TableA
(
id int IDENTITY,
name varchar(256),
description varchar(256)
)

CREATE TABLE TableB
(
id int IDENTITY,
name varchar(256),
description varchar(256)
) --unique constraint on name, description

CREATE TABLE TableA_TableB
(
idA int,
idB int
) --composite key referencing TableA and TableB

情况是我在TableB中有很多违反唯一约束的重复记录,这些重复记录在TableA_TableB中被引用。所以我试图删除这些记录,这很简单(使用以下 CTE),但是更新 TableA_TableB 中的记录以反射(reflect)此更改的最佳方法是什么,即让 TableA_TableB 记录引用相同的 ID TableB 而不是每个重复项的不同 ID?

;WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY [Name], [Description]
ORDER BY ( SELECT 0)) RN
FROM TableB)

DELETE FROM cte
WHERE RN = 1

最佳答案

注意:将b.RowNum=1更改为b.RowNum>1

首先,您应该尝试使用 ROLLBACK,然后,如果没问题,取消注释 COMMIT(此脚本未测试):

DECLARE @UpdatedRows TABLE(ID INT PRIMARY KEY);

BEGIN TRANSACTION;

;WITH Base
AS(
SELECT ROW_NUMBER() OVER (PARTITION BY [Name], [Description] ORDER BY ( SELECT 0)) RowNum,
MIN(id) OVER(PARTITION BY [Name], [Description]) AS NewID,
ID -- Old ID
FROM TableB
),TableB_RowsForUpdate
AS(
SELECT *
FROM Base b
WHERE b.RowNum>1
)
UPDATE target
SET IDB=b.NewID
OUTPUT deleted.IDB INTO @UpdatedRows
FROM TableA_TableB target
INNER JOIN TableB_RowsForUpdate b ON target.IDB=b.ID;

DELETE b
FROM TableB b INNER JOIN @UpdatedRows upd ON b.ID=upd.ID;

ROLLBACK;
-- COMMIT;

关于sql-server - 删除重复行同时更新关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791883/

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