【问题标题】:How to remove duplicate values inserted into an identity column in a table?如何删除插入到表中标识列中的重复值?
【发布时间】:2011-04-29 11:33:26
【问题描述】:

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

我有一个带有 DetailID 列的表 Details | FKey | Col1 | Col2 | Col3 | Col4

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

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

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

【问题讨论】:

  • 您能否详细说明您希望保留哪些副本?
  • 如果行相同,那么我想删除一行,如果行不同,然后想将标识值更新到下一个。
  • 是的,但我们只知道一列 - IDENTITY。您还想使用其他列来区分重复项吗?
  • 实际上该表与主表有外键,所以首先我们只需要选择那些具有相同标识的行,然后我们需要匹配所有列的数据,如果都相同,然后只保留一行并删除其他人,但只有身份是重复的,那么我们需要更新身份值。
  • @Jeevan Bhatt:建议您使用更多信息更新您的问题

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


【解决方案1】:
【解决方案2】:

您可以在 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

这将为您生成一个重复项列表 - 您现在可以更新或删除它们,或者您想对它们做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2012-07-17
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2012-01-04
    相关资源
    最近更新 更多