删除除重复值之外的所有行

时间:2013-11-08 14:46:25

标签: mysql sql

我有一个包含三列的表格:KEYVALUELAST_UPDATED

VALUE个重复字段。我想删除与相同的VALUE的所有行,除了以用于最近更新的行。

所以如果表包含这些行:

1, "A", 2013-11-08
2, "B", 2013-10-30
3, "A", 2013-11-07
4, "A", 2013-11-01
5, "B", 2013-11-01

然后我想保留这些行:

1, "A", 2013-11-08
5, "B", 2013-11-01

如何在SQL中执行此操作?我想DELETE FROM table WHERE key IN (SELECT key FROM table GROUP BY value HAVING count(*)>1)会从那些重复值中删除一个随机(?)行,但是如何删除最近更新的行之外的所有行?

2 个答案:

答案 0 :(得分:3)

您可以使用左连接执行此操作:

DELETE t
FROM table t
LEFT JOIN table t2 ON t.value = t2.value
AND t2.last_updated > t.last_updated
WHERE t2.key IS NOT NULL

这意味着对于每一行,它会查找具有更新更新日期的另一行,如果有,则将删除该行。您可能需要查看日期差异,而不是使用大于比较日期,因为它更可靠。

在这种情况下,我希望左连接的性能远远好于创建和连接到内联表,但如果性能是一个问题,那么最好尝试两种方式并选择最一致的性能最好的。

答案 1 :(得分:2)

这样的事情应该有效:

DELETE t FROM myTable t
INNER JOIN
(
 SELECT VALUE,MAX(LAST_UPDATED) as mostRecent 
 FROM myTable 
 GROUP BY VALUE
 HAVING COUNT(*) > 1           
) t2 ON t.VALUE = t2.VALUE 
     AND t.LAST_UPDATED != t2.mostRecent;