我需要从数据库中删除重复的行。我能用简单的SQL查询来做吗?如果不能,请给我展示一些快速的算法来完成它。
例子:
id| field_one | field_two |
1 | 0000000 | 11111111 |
2 | 2222222 | 33333333 |
3 | 2222222 | 33333333 |
4 | 4444444 | 55555555 |
我需要删除id为2(或3,无所谓,它们是相等的,但不是同时存在)的行。 感谢任何帮助。
delete from the_table where id in
(select max(id) from the_table
group by field_one, field_two
having count(*) > 1)
正如评论中所指出的,如果一行出现三次,则此方法将无法奏效。您可以重复运行此(繁重的)查询,直到它停止删除内容,或者等待更好的解决方案...
首先选择所有不同的行,然后删除其他行:
DELETE FROM MyTable
WHERE id NOT IN
(
SELECT MAX(id) FROM MyTable
GROUP BY field_one, field_two
)
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
Thilo的回答很有用,它可以实现你想要的功能。但是如果你有很多行数据,这个算法的复杂度会变得很高。如果我是提问者,我会选择Thilo的答案作为最佳答案,但是我还想给你另一个选项:如果你有很多行数据,另一个可能性是:
创建一个新表,为列组合(field_one, field_two)设置唯一索引,并将第一个表的内容复制到新表中。然后删除旧表并将新表重命名为旧表名称。
就是这样。