代码之家  ›  专栏  ›  技术社区  ›  SNA

删除和显示重复记录的单个查询

  •  5
  • SNA  · 技术社区  · 15 年前

    在一次采访中问的一个问题是,

    一张表有100条记录。其中50个 是重复的。单人间可以吗 查询以删除重复记录 从表中选择和 显示剩余的50条记录。

    在单个SQL查询中是否可以这样做?

    谢谢

    SNA

    3 回复  |  直到 12 年前
        1
  •  6
  •   Lieven Keersmaekers    15 年前

    对于SQL Server,您将使用类似这样的方法

    DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER)
    
    INSERT INTO @Table VALUES (1, 100)
    INSERT INTO @Table VALUES (2, 100)
    INSERT INTO @Table VALUES (3, 200)
    INSERT INTO @Table VALUES (4, 200)
    
    DELETE FROM @Table
    OUTPUT Deleted.*
    FROM  @Table t
          INNER JOIN (
            SELECT    ID = MAX(ID)
            FROM      @Table
            GROUP BY  PossibleDuplicate
            HAVING    COUNT(*) > 1
          ) d ON d.ID = t.ID
    

    这个 OUTPUT 语句显示被删除的记录。

    更新:

    上面的查询将删除重复项,并为您提供已删除的行,而不是保留的行。如果这对您很重要(总而言之,剩下的50行应该与删除的50行相同),您可以使用 SQL Server's 2008 MERGE 实现此目的的语法。

        2
  •  1
  •   Community Mohan Dere    8 年前

    Lieven's Answer 是如何输出已删除行的良好解释。我想增加两件事:

    1. 如果您想对输出执行除显示以外的其他操作,可以指定 OUTPUT INTO @Tbl (何处) @Tbl 是您在删除之前声明的表变量);

    2. 使用 MAX , MIN 或任何其他聚合只能处理每个组的一个重复行。如果您可能有许多重复项,下面的SQL Server 2005+代码将有助于实现这一点:

    ;WITH Duplicates AS
    (
        SELECT
            ID,
            ROW_NUMBER() OVER (PARTITION BY DupeColumn ORDER BY ID) AS RowNum
    )
    DELETE FROM MyTable
    OUTPUT deleted.*
    WHERE ID IN
    (
        SELECT ID
        FROM Duplicates
        WHERE RowNum > 1
    )
    
        3
  •  0
  •   Jonas Elfström    15 年前

    听起来不太可能,至少在ansi-sql中是这样,因为delete只返回已删除行数的计数。