2010-06-28 6 views
4

Je suis à la recherche d'une seule requête SQL pour exécuter sur une table d'oracle qui conservera un nombre n d'enregistrements dans une table et supprimer le resteSQL pour supprimer les enregistrements les plus anciens d'une table

J'ai essayé le

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

Mais il semble que je ne peux pas avoir order by dans la sélection imbriquée.

Toute aide appréciée

Répondre

12

Lorsque vous utilisez ORDER BY avec ROWNUM le ROWNUM est appliqué en premier, afin de ne pas les résultats que vous attendez. Vous pouvez modifier votre SQL à:

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

Il existe de nombreuses autres façons d'écrire ceci. Si la table est grande et que la plupart des lignes seront supprimées, alors peut-être que ce sera plus rapide:

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

Va le remettre demain. –

+0

Merci pour cela, a travaillé un rêve, apprécie la version optimisée aussi – Liam

Questions connexes