首页 > 解决方案 > 在 SQL Server 管理器中删除每个帐户 NO 的重复项

问题描述

我有一个名为 CAL 的表(是一个包含每个客户帐户的注释的表)。在某些时候,导入过程为每个 acct_no 添加了 265 个重复的注释,我需要删除每个 acct_no 的所有注释,但只有 1 个。

我能够提取查询以查找重复项,但不知道如何删除每个 acct_No 的重复项,同时每个 acct_no 至少保留 1 条记录

SELECT ACCT_NO, [TYPE], DATE_ADDED, TIME_ADDED, ADDED_BY, NOTES, COUNT(*)
FROM PLSHARED.DBO.CAL
GROUP BY ACCT_NO, [TYPE], DATE_ADDED, TIME_ADDED, ADDED_BY, NOTES
HAVING COUNT(*) > 10
ORDER BY ACCT_NO

示例结果为: ACCT_NO TYPE TIME_ADDED ADDED_BY NOTES COUNT 100224 ~APPAACOLC 2019-04-23 11:35:00 APPAA 电话:6463736300 结果:LEFT MESSAGE 265 100299 ~APPAACOLC 2019-04-23 11:36:00 APPAA 电话 97AA 结果: :已回答 265 100361 ~APPAACOLC 2019-04-23 11:35:00 APPAA 电话:9178863391 结果:已回答 265 100630 ~APPAACOLC 2019-04-23 11:36:00 APPAA 电话:5164663631 结果:5164663631 结果:166239 留言已回答 265 101546 ~APPAACOLC 2019-04-23 11:37:00 APPAA 电话:5163651466 结果:已回答 265 101809 ~APPAACOLC 2019-04-23 11:37:00 APPAA 电话:9176985008 结果:265 101809 -23 11:37:00 APPAA 电话:9174406128 结果:LEFT MESSAGE 265

标签: duplicatessql-delete

解决方案


想通了,这是正确的代码:

WITH Duplicates_CTE(ACCT_NO, [TYPE], DATE_ADDED, TIME_ADDED, ADDED_BY, NOTES, U_INVNO, recno)
AS
(
 SELECT ACCT_NO, [TYPE], DATE_ADDED, TIME_ADDED, ADDED_BY, NOTES, U_INVNO,Min(recno) recno
 FROM PLSHARED.DBO.cal
 GROUP BY ACCT_NO, [TYPE], DATE_ADDED, TIME_ADDED, ADDED_BY, NOTES,U_INVNO
 HAVING Count(*) > 3)

DELETE FROM PLSHARED.DBO.cal
WHERE recno IN (
 SELECT cal.recno
 FROM PLSHARED.DBO.cal
 INNER JOIN Duplicates_CTE
 ON cal.ACCT_NO = Duplicates_CTE.ACCT_NO
 and cal.[TYPE] = Duplicates_CTE.[TYPE]
 and cal.DATE_ADDED = Duplicates_CTE.DATE_ADDED
 and cal.TIME_ADDED = Duplicates_CTE.TIME_ADDED
 and cal.ADDED_BY = Duplicates_CTE.ADDED_BY
 and cal.NOTES = Duplicates_CTE.NOTES
 and cal.U_INVNO = Duplicates_CTE.U_INVNO
 AND cal.recno <> Duplicates_CTE.recno
)

推荐阅读