【问题标题】:How to delete only few rows if several rows are duplicated in SQL?如果 SQL 中有几行重复,如何只删除几行?
【发布时间】:2017-07-05 16:34:48
【问题描述】:

如果多行重复,如何只删除几行(多于 1 行)?当我尝试设置条件时,所有行都被删除。我使用的是 SQL Server 2008。

【问题讨论】:

  • 您好,欢迎您。请查看How do I ask a good question? - 我们在这里帮助您解决特定的编程问题,而不是为您编写代码。请向我们展示您迄今为止所做的尝试,与我们分享您的想法,我们将帮助您找到解决方案,但没有人会为您编写代码。根据What topics can I ask about here?,您的问题实际上与 Stackoverflow 无关。我要求您根据我们的指南编辑您的问题,否则您将不会获得太多帮助

标签: sql database sql-server-2008


【解决方案1】:

使用 top 命令删除。

DELETE TOP(n) TableName
WHERE (Condition which pulls duplicate rows)
where n is the number of rows to delete.

【讨论】:

    【解决方案2】:

    下面的 SQL 会帮助你。

    DELETE TOP(n) TableName
    WHERE (Condition which pulls duplicate rows)
    

    其中n 是要删除的行数。

    提示:始终尝试使用主键(主键用于唯一标识表中的每一行),因为它会对性能、可用​​性和可扩展性产生重大影响整个数据库。

    【讨论】:

      【解决方案3】:

      使用下面的查询

      -- Check : This query will give you unique records 
      SELECT MAX(ID)
      FROM MyTable
      GROUP BY Column1, Column2, Column3 ......
      
      -- Now delete the record apart from unique record
      DELETE
      FROM MyTable
      WHERE ID NOT IN
      (
      SELECT MAX(ID)
      FROM MyTable
      GROUP BY Column1, Column2, Column3 ......)
      

      注意:这里的 ID 是主键。如果您的表中不存在 ID,则首先使用 AUTO_INCREMENT 值创建 ID,然后运行上述查询。

      例子:

      我的表

      col1  col2 col3 col4 col5 col6 col7
      john  1    1    1    1    1    1 
      john  1    1    1    1    1    1
      john  1    1    1    1    1    1
      sally 2    2    2    2    2    2
      sally 2    2    2    2    2    2
      

      如果 ID 不存在,则添加具有自动递增值的 ID。添加ID后

      ID  col1  col2 col3 col4 col5 col6 col7
      1   john  1    1    1    1    1    1 
      2   john  1    1    1    1    1    1
      3   john  1    1    1    1    1    1
      4   sally 2    2    2    2    2    2
      5   sally 2    2    2    2    2    2
      

      -- 检查:此查询将为您提供唯一记录

      SELECT MAX(ID) FROM MyTable
      GROUP BY col1, col2, col3, col4, col5, col6, col7
      

      查询输出 最大(ID)
      3
      5

      -- 现在删除唯一记录之外的记录

      DELETE
      FROM MyTable
          WHERE ID NOT IN
          (
           SELECT MAX(ID) FROM MyTable
           GROUP BY col1, col2, col3, col4, col5, col6, col7)
      

      【讨论】:

        【解决方案4】:

        这个答案假定表中有一个主键。

        写完这篇文章后,我查看了链接为可能重复的答案 (How to delete duplicate rows in sql server?)。我更喜欢 CTE 方法。

        创建测试数据

        /* Create test data tables */
        IF OBJECT_ID('tempdb.dbo.#td', 'U') IS NOT NULL
          DROP TABLE #td; 
        
        CREATE TABLE #td ( id int identity, data int NOT NULL ) ;
        
        INSERT INTO #td (data)
        VALUES (1),(1),(2),(3),(3),(3),(1),(3)
        ;
        

        我的原创

        /* Test data includes dupes. */
        SELECT * FROM #td ;
        
        /* Now find and DELETE the dupes. */
        DELETE FROM #td 
        WHERE id IN (
            SELECT sq.id
            FROM (
                SELECT id, ROW_NUMBER() OVER ( PARTITION BY data ORDER BY (data) ) AS rn
                FROM #td
            ) sq
            WHERE sq.rn > 1
        )
        ;
        
        /* Dupes are gone. */
        SELECT * FROM #td ;
        

        更好

        SELECT * FROM #td ; 
        
        WITH CTE AS(
           SELECT data, RN = ROW_NUMBER()OVER(PARTITION BY data ORDER BY data)
           FROM #td
        )
        DELETE FROM CTE WHERE RN > 1
        
        SELECT * FROM #td ; 
        

        【讨论】:

          【解决方案5】:

          使用删除顶部命令 并在括号内给出行数。 从表中删除 top()

          【讨论】:

            【解决方案6】:

            创建表 TabStack ( col1 varchar(10), col2 varchar(10), col3 日期 )

            插入 TabStack 价值观(

            '约翰','康纳','01.01.1980'), ('莎拉','康纳','03.04.1978'), ('约翰','康纳','01.01.1977')

            与 cte 作为 ( select col1, col2, col3, ROW_NUMBER() over(partition by col1,col2 order by col3) rn 来自 TabStack )

            从 cte 中删除 其中 rn>1

            【讨论】:

              猜你喜欢
              • 2011-06-01
              • 1970-01-01
              • 2019-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多