【问题标题】:Delete duplicate rows with same values in table but retain one row in SQL Server删除表中具有相同值的重复行,但在 SQL Server 中保留一行
【发布时间】:2016-11-11 18:27:07
【问题描述】:

这是我的存储过程中的查询之一,我将Main 表中的记录插入到重复表中,之后我想在我的主表中删除多个重复行。

这是我的代码

 IF EXISTS (SELECT * 
            FROM [JOB] 
            WHERE 
              AND ExternalSourceId = @ExternalSourceId 
              AND Id <> @Id 
              AND IsActive = 1)
 BEGIN
    INSERT INTO DupJob 
        SELECT * 
        FROM [JOB] j 
        WHERE 
          AND ExternalSourceId = @ExternalSourceId 
          AND Id <> @Id 
          AND IsActive = 1 
          AND NOT EXISTS (SELECT * FROM DupJob dj WHERE J.Id = dj.Id)     
    -- the delete should delete all duplicates except one ?
 END    

寻求帮助以继续,谢谢

【问题讨论】:

  • 您遇到了什么问题?
  • 我只是想在删除语句中继续进行

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

row_number() 和 CTE 是一种方便的方法。我不确定你想要的逻辑到底是什么,但它是这样的:

with todelete as (
      select j.*,
             row_number() over (partition by OrganizationName, JobTitle, PostalCode, ExternalSourceId)
                                order by id) as seqnum
      from job j
     )
delete from todelete
    where seqnum > 1;

这将在partition by 中的每一列中保留一行,即最小值为id 的那一行。

【讨论】:

  • 我认为使用 row_number() 或 rank() 也是一样的。我可以将上面的内容与我的查询结合使用吗?请建议
  • 排名和行号在对待平局的方式上略有不同。没有关系,它们是等价的。
猜你喜欢
  • 2014-06-23
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多