2010-06-28 38 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

相關問題