我有一个包含三列的表格:KEY
,VALUE
和LAST_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)
会从那些重复值中删除一个随机(?)行,但是如何删除除最近更新的行之外的所有行?
答案 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;