【问题标题】:Deletion of duplicate records using one query only仅使用一个查询删除重复记录
【发布时间】:2013-11-21 20:24:57
【问题描述】:

我使用的是 SQL Server 2005。

我有一张这样的桌子-

ID    Name
1      a
1      a
1      a
2      b
2      b
3      c
4      d
4      d

在此,我想删除所有重复的条目并只保留一个实例 -

ID     Name
1       a
2       b
3       c
4       d

我可以通过在该表中添加另一个标识列并在其中包含唯一编号然后删除重复记录来轻松地做到这一点。但是我想知道我是否可以删除重复的记录不添加额外的列到这个表中。

另外,如果这可以仅使用一个查询语句来完成。即不使用存储过程或临时表。

【问题讨论】:

  • 你为什么批准this invalid suggested edit?请花一些时间来审查它。
  • @hims056 - 它现在以正确的方式编辑。谢谢。

标签: sql sql-server-2005


【解决方案1】:

CTE 中使用ROW_NUMBER 允许您在保留唯一行的同时删除重复值。

WITH q AS (
  SELECT RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID )
         , ID
         , Name
  FROM   ATable
)
DELETE FROM q WHERE RN > 1

【讨论】:

    【解决方案2】:

    Lieven 是对的……但是您可能想通过在 delete 语句中添加一个 top 子句来调整 Lieven 的代码,如下所示:

    从 q 中删除 top(1),其中 RN > 1;

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      你可以使用这个查询:

      delete a from
      (select id,name, ROW_NUMBER() over (partition by id,name order by id) row_Count
      from dup_table) a
      where  a.row_Count >1
      

      【讨论】:

        【解决方案4】:
        delete from table1
        USING table1, table1 as vtable
        WHERE (NOT table1.ID=vtable.ID)
        AND (table1.Name=vtable.Name)
        

        【讨论】:

        • 你确定 SQL server 中可以使用 USING 吗?我在 USING 附近遇到语法错误。
        • 对不起,我已经为 MySQL 测试过,我认为它也适用于 SQL。你得到什么错误?
        • 没问题,我在 USING 附近的语法不正确。我认为 SQL 中没有任何 USING 键。它将被转换为 FROM。
        【解决方案5】:
        DELETE FROM tbl
        WHERE ID NOT IN (
            SELECT MIN(ID)
            FROM tbl
            GROUP BY Name
        )
        

        【讨论】:

        • 顺便提一下,我没有对你投反对票。但是重复行的 ID 也是相同的。然而,
        • 这将删除 ID 1 的所有记录,而不是 OP 需要的。 (不是我的反对票)。
        猜你喜欢
        • 2012-10-08
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2011-03-23
        • 2019-09-27
        • 2021-07-12
        • 2020-09-02
        • 2015-12-03
        相关资源
        最近更新 更多