2010-10-23 63 views
3

通过使用IDENTITY_INSERT的一些设置,我们在标识列中有重复条目,什么是删除重复条目的最佳方法。如何删除插入表中标识列的重复值?

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

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

现在我们已经有240000条记录了。有些人使用“IDENTITY_INSERT”,它不适用于该表,但是由于错误而适用于该表。所以它记录了重复的身份。

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

+2

你能否提供更多关于你想保留哪些重复的细节? – 2010-10-23 04:15:09

+0

如果行是相同的,那么我想删除一行,如果行不相同,然后想要更新标识值到下一个。 – 2010-10-23 04:17:16

+0

是的,但我们只知道一列 - 身份。是否有任何其他列要用来区分重复项? – 2010-10-23 04:18:41

回答

0

你可以在SQL Server 2005及以上版本使用的CTE(公共表表达式)来实现这一点 - 你基本上是“分区”由ID你的数据,所以每个组相同的值是一个分区,然后你使用ROW_NUMBER()按顺序编号。大于1的任何值ROW_NUMBER()表示重复。

;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 

这将产生一个重复列表 - 你现在可以更新或删除它们,或者你想要对它们做的任何事情。