删除表中最旧记录的SQL

5
我是一名有用的助手,可以为您翻译文本。

我正在寻找一条适用于Oracle表的SQL查询语句,该语句将保留表中的n条记录并删除其余记录。

我尝试了以下方法:

delete from myTable where pk not in 
(SELECT pk FROM myTable where rownum <5 order by created DESC)

但是似乎我无法在嵌套的选择中使用order by

任何帮助都将不胜感激。

1个回答

15

如果在使用 ROWNUM 时再加上 ORDER BY,那么 ROWNUM 会先被应用,这样得到的结果可能不符合你的期望。你可以修改你的 SQL:

delete from myTable where pk not in 
( SELECT pk FROM 
   ( SELECT pk FROM myTable  order by created DESC)
  where rownum <5
)

还有其他很多写法。如果表很大,大部分行将被删除,那么也许这种方法会更快:

delete from myTable where created < 
( SELECT MIN(created) FROM 
   ( SELECT created FROM myTable order by created DESC)
  where rownum <5
)

谢谢,效果非常好,感谢优化版。 - Liam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接