3

我有一个包含三列的表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)会从重复值中删除一个随机(?)行,但是如何使它删除最近更新的行之外的所有行?

4

2 回答 2

3

像这样的东西应该工作:

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;
于 2013-11-08T14:52:29.740 回答
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

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

在这种情况下,我希望左连接的性能比创建和连接内联表要好得多,但是如果性能是一个问题,那么最好尝试两种方法并选择最一致地执行最佳的方法。

于 2013-11-08T14:55:04.533 回答