从数据库中删除重复行

3

我需要从数据库中删除重复的行。我能用简单的SQL查询来做吗?如果不能,请给我展示一些快速的算法来完成它。

例子:

id| field_one | field_two |
1 | 0000000   | 11111111  |
2 | 2222222   | 33333333  |
3 | 2222222   | 33333333  |
4 | 4444444   | 55555555  |

我需要删除id为2(或3,无所谓,它们是相等的,但不是同时存在)的行。 感谢任何帮助。
4个回答

5
delete from the_table where id in
   (select max(id) from the_table
      group by field_one, field_two
      having count(*) > 1)

正如评论中所指出的,如果一行出现三次,则此方法将无法奏效。您可以重复运行此(繁重的)查询,直到它停止删除内容,或者等待更好的解决方案...


+1 - 正在发布完全相同的答案。速度很重要! - codingbadger
1
如果您有相同的行三次呢? - CristiC
@Parkyprg 感谢上帝我还没有遇到过这个问题 :) 但是为了增加知识,如果有人展示N个重复项的解决方案,我会很高兴。 - Scorpil
我得到了这个错误:ERROR 1093 (HY000):你不能在FROM子句中更新目标表'xyz'。 - Kesara Wimal

3

首先选择所有不同的行,然后删除其他行:

DELETE FROM MyTable 
WHERE id NOT IN
      (
        SELECT MAX(id) FROM MyTable
        GROUP BY field_one, field_two
      )

+1. 如果行被重复多次,那么这将起作用。但是,如果大多数行没有重复,它可能会相当慢。我想根据手头的情况拥有两个查询是很好的选择。 - Thilo
当存在许多重复项时,另一种有用的方法可能是将“好”的行复制到一个工作/暂存表中,然后截断旧表。这避免了碎片化问题。 - Thilo

2
set rowcount 1 
delete userTbl1 from userTbl1 a1 where (select count(UName) from userTbl1 a2 where a2.UName =a1.UName)>1
while @@rowcount > 0 
delete userTbl1 from userTbl1 a1 where (select count(UName) from userTbl1 a2 where a2.UName =a1.UName)>1
set rowcount 0

1

Thilo的回答很有用,它可以实现你想要的功能。但是如果你有很多行数据,这个算法的复杂度会变得很高。如果我是提问者,我会选择Thilo的答案作为最佳答案,但是我还想给你另一个选项:如果你有很多行数据,另一个可能性是:

创建一个新表,为列组合(field_one, field_two)设置唯一索引,并将第一个表的内容复制到新表中。然后删除旧表并将新表重命名为旧表名称。

就是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接