Oracle
 sql >> Database >  >> RDS >> Oracle

Eliminare tutti i record tranne quello più recente?

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

Vista la lunga discussione nei commenti, si prega di notare quanto segue:

La dichiarazione di cui sopra sarà funziona su qualsiasi database che implementa correttamente la coerenza di lettura a livello di istruzione indipendentemente da eventuali modifiche alla tabella mentre l'istruzione è in esecuzione.

Database in cui so sicuramente che funziona correttamente anche con modifiche simultanee alla tabella:Oracle (quello di cui tratta questa domanda), Postgres, SAP HANA, Firebird (e molto probabilmente MySQL che utilizza InnoDB). Perché garantiscono tutti una visione coerente dei dati nel momento in cui è iniziata la dichiarazione. Modifica del <> a < non cambierà nulla per loro (incluso Oracle di cui tratta questa domanda)

Per i database sopra menzionati, l'affermazione è non soggetto al livello di isolamento perché letture fantasma o non ripetibili possono avvenire solo tra più dichiarazioni - non all'interno di un singolo dichiarazione.

Per i database che non implementano correttamente MVCC e si basano sul blocco per gestire la concorrenza (bloccando così l'accesso in scrittura simultaneo), ciò potrebbe effettivamente produrre risultati errati se la tabella viene aggiornata contemporaneamente. Per quelli la soluzione alternativa usando < è probabilmente necessario.