Oracle
 sql >> Base de données >  >> RDS >> Oracle

Supprimer tous les enregistrements sauf le plus récent ?

DELETE FROM student
WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime) 
                              FROM student s2
                              WHERE s2.StudentID  = student.StudentID)

Compte tenu de la longue discussion dans les commentaires, veuillez noter ce qui suit :

La déclaration ci-dessus sera travailler sur n'importe quelle base de données qui implémente correctement la cohérence de lecture au niveau de l'instruction, quelles que soient les modifications apportées à la table pendant l'exécution de l'instruction.

Bases de données où je sais parfaitement que cela fonctionne correctement même avec modifications simultanées de la table :Oracle (celui sur lequel porte cette question), Postgres, SAP HANA, Firebird (et très probablement MySQL utilisant InnoDB). Parce qu'ils garantissent tous une vue cohérente des données au moment où l'instruction a commencé. Modification du <> à < ne changera rien pour eux (y compris Oracle sur lequel porte cette question)

Pour les bases de données mentionnées ci-dessus, la déclaration est not soumis au niveau d'isolement, car les lectures fantômes ou les lectures non répétables ne peuvent se produire qu'entre plusieurs déclarations - pas dans un simple déclaration.

Pour les bases de données qui n'implémentent pas correctement MVCC et s'appuient sur le verrouillage pour gérer la concurrence (bloquant ainsi l'accès en écriture simultané), cela peut en fait donner des résultats erronés si la table est mise à jour simultanément. Pour ceux la solution de contournement en utilisant < est probablement nécessaire.