【问题标题】:Remove 1 Duplicate row from SQL Table if two column data matches [duplicate]如果两列数据匹配,则从 SQL 表中删除 1 个重复行 [重复]
【发布时间】:2016-08-07 18:11:29
【问题描述】:

我的表中有三列

键名, 数字, 数据

数据包含大量重复条目。如果重复“KeyName”和“Data”,我需要从表中的每个重复条目中删除 1 行。 我将如何实现这一点是 SQL 查询。

【问题讨论】:

  • 你的 rdbms 是什么? Sql Server、Postgres、Mysql ......?
  • 如果有两个以上的重复项怎么办?
  • 我的是 SQL 服务器。我只有很少的条目超过两个重复项。我想手动删除。

标签: sql sql-server


【解决方案1】:

应该这样做

WITH CTE
    AS (SELECT KeyName
            , Number
            , Data
            , [rn] = ROW_NUMBER() OVER(PARTITION BY KeyName
                                          , Data ORDER BY KeyName
                                                     , Data)
        FROM   yourtable)
     /* UNCOMMENT BELOW TO DELETE */
     --DELETE
    --FROM   CTE
    --WHERE  rn > 1;

    SELECT *
    FROM   CTE
    WHERE  rn > 1;

【讨论】:

  • 成功了,谢谢
【解决方案2】:

您可以使用row_number()为每一对保留一行:

with todelete as (
      select t.*,
             row_number() over (partition by keyname, data order by (select NULL)) as seqnum
      from t
     )
delete
from todelete
where seqnum > 1;

与任何此类操作一样,您应该在删除之前先检查。这很简单:

with todelete as (
      select t.*,
             row_number() over (partition by keyname, data order by (select NULL)) as seqnum
      from t
     )
select *
from todelete
where seqnum > 1;

【讨论】:

  • 刚刚收到您的正确答案。抱歉,stackoverflow 不允许将两个答案标记为正确。谢谢您的回复
  • @arun 。 . .接受哪个答案的决定完全取决于 OP。
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 2021-05-28
  • 2021-11-12
  • 2018-05-15
  • 2021-11-07
  • 2013-01-01
  • 2022-01-16
  • 2019-10-29
相关资源
最近更新 更多