2010-06-28 37 views
4

我正在寻找一个SQL查询到在Oracle表将保留在表中的记录n个,并删除运行,其余SQL删除最早的记录表中​​的

我尝试以下

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

但现在看来,我不能在嵌套选择order by

任何帮助表示赞赏

回答

12

当您使用ORDER BY与ROWNUM的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 
) 
+0

明天我们就开始行动吧。 – 2010-06-28 09:00:59

+0

谢谢你,做了一个梦,欣赏优化版本 – Liam 2010-06-28 09:23:35

相关问题