【问题标题】:How to delete duplicate rows with SQL?如何使用 SQL 删除重复行?
【发布时间】:2011-08-03 00:06:26
【问题描述】:

我有一个包含一些行的表。每一行都有一个日期字段。现在,它可能是日期的重复。我需要删除所有重复项,只存储id 最高的行。这怎么可能使用 SQL 查询?

现在:

date      id
'07/07'   1
'07/07'   2
'07/07'   3
'07/05'   4
'07/05'   5

我想要什么:

date      id
'07/07'   3
'07/05'   5

【问题讨论】:

  • 从您发送的数据中,您最终得到两行而不是三行! 07/05 重复。

标签: sql


【解决方案1】:
DELETE FROM table WHERE id NOT IN
    (SELECT MAX(id) FROM table GROUP BY date);

【讨论】:

  • 哇,我是绕了个弯还是怎么的?这绝对是最好的方法。
  • 我觉得你的方法有点太复杂了......但老实说,我想先使用 3 个查询而不是这个。
  • 这个查询对于这个答案也很有用: SELECT date, COUNT(date) AS NumOccurrences FROM table GROUP BY date HAVING ( COUNT(date) > 1 )
  • @djangofan:几乎,您只需选择 id 而不是 COUNT(date)。
  • 然而,由于它对子选择的愚蠢限制,这在 MySQL 中不起作用。
【解决方案2】:

我没有评论权,所以这里是我的评论作为答案,以防有人遇到同样的问题:

在 SQLite3 中,有一个名为“rowid”的隐式数字主键,因此相同的查询看起来像这样:

DELETE FROM table WHERE rowid NOT IN
(SELECT MAX(rowid) FROM table GROUP BY date);

这适用于任何表,即使它不包含名为“id”的主键列。

【讨论】:

    【解决方案3】:

    对于 mysql、postgresql、oracle 更好的方法是 SELF JOIN。

    Postgresql:
    DELETE FROM table t1 USING table t2 WHERE t1.date=t2.date AND t1.id<t2.id;
    
    MySQL        
    DELETE FROM table
    USING table, table as vtable
    WHERE (table.id < vtable.id)
    AND (table.date=vtable.date)
    

    SQL 聚合 (max,group by) 函数几乎总是很慢。

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2023-02-06
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多