我有三列的表:KEY,VALUE和LAST_UPDATED
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)会从具有重复值的行中删除单个random(?)行,但是如何使其除最近更新的行之外的 所有 行删除呢?
DELETE FROM table WHERE key IN (SELECT key FROM table GROUP BY value HAVING count(*)>1)
您可以使用左联接来执行此操作:
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
这意味着对于每一行,它会寻找更新日期最近的另一行,如果有更新日期,则该行将被删除。您可能需要查看日期差异,而不是使用大于来比较日期,因为它比较可靠。
我希望在这种情况下,左联接的性能要比创建和联接到内联表好得多,但是如果性能是一个问题,那么最好尝试两种方法,并选择性能最稳定的方法。