如何删除插入表中标识列的重复值?

时间:2010-10-23 04:11:47

标签: sql sql-server sql-server-2005 tsql

通过某些设置使用IDENTITY_INSERT我们在标识列中有重复条目,删除重复条目的最佳方法是什么。

我有一个表详细信息使用列DetailID | FKey | Col1 | Col2 | Col3 | Col4

DetailID是“Identity”,FKey是另一个表的外键。

现在我们已有240000条记录了。有人使用了“IDENTITY_INSERT”,这不适用于此表,但错误地将其应用于此表。所以它有重复身份的记录。

首先我们需要选择那些具有相同标识的行,然后我们需要匹配所有列的数据,如果所有列都相同,那么只保留一行并删除其他行,但只有标识重复然后我们需要更新标识值。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您可以在SQL Server 2005中使用CTE(公用表表达式)以实现此目的 - 您基本上将数据“分区”ID,因此每组相同的值都是一个分区,然后您使用ROW_NUMBER()按顺序编号。 ROW_NUMBER()大于1的任何值都表示重复。

;WITH Duplicates AS
( 
    SELECT 
      DetailID, FKey, Col1, Col2, Col3, Col4,
      ROW_NUMBER() OVER (PARTITION BY DetailID ORDER BY FKey) AS 'RowNum'
    FROM dbo.YourTable
)
SELECT 
  DetailID, FKey, Col1, Col2, Col3, Col4, RowNum
FROM Duplicates
WHERE RowNum > 1

这将为您生成一份重复列表 - 您现在可以更新它们,或者删除它们,或者您想要用它们做任何事情。