删除没有密钥的重复项

时间:2019-03-13 17:16:57

标签: sql sql-server tsql

我正在尝试删除其中一张表中的所有重复项。它们都不是键或唯一的。尝试向Google提供一些解决方案,但它们似乎不起作用。

delete T1
from MyTable T1, MyTable T2
where T1.MyTableCustomer = T2.MyTableCustomer
and T1.MyTableCustomerId = T2.MyTableCustomerId
and T1.MyTableSoldToParty = T2.MyTableSoldToParty

因此,我要删除在所有列上已经存在具有完全相同值的相等行的所有行。

如何在SQL Server(2017)中将其存档?

1 个答案:

答案 0 :(得分:4)

这很棘手,因为没有任何ID或唯一键,很难指定要删除的记录。但是,SQL Server确实提供了一种实现它的方法。我在this page上找到了一种解决方案,并将其适应了您的餐桌。试试这个:

WITH CTE AS
(
    SELECT *,ROW_NUMBER() OVER (PARTITION BY MyTableCustomer, MyTableCustomerId, MyTableSoldToParty ORDER BY MyTableCustomer, MyTableCustomerId, MyTableSoldToParty) AS RN
    FROM MyTable
)

DELETE FROM CTE WHERE RN<>1

它的工作方式是分配一个附加列,该列基本上是所有相同记录的计数器,然后删除值大于1的记录。这将保留一个重复值,并删除所有其他值。