DELETE FROM student
WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime)
FROM student s2
WHERE s2.StudentID = student.StudentID)
Med tanke på den långa diskussionen i kommentarerna, vänligen notera följande:
Ovanstående uttalande kommer arbeta med vilken databas som helst som korrekt implementerar läskonsistens på satsnivå oavsett ändringar i tabellen medan satsen körs.
Databaser där jag definitivt vet att detta fungerar korrekt även med Samtidiga ändringar av tabellen:Oracle (den som denna fråga handlar om), Postgres, SAP HANA, Firebird (och troligen MySQL med InnoDB). Eftersom de alla garanterar en konsekvent bild av data vid den tidpunkt då uttalandet startade. Ändra <
kommer inte att ändra något för dem (inklusive Oracle som denna fråga handlar om)
För de ovan nämnda databaserna är påståendet inte omfattas av isoleringsnivån eftersom fantomläsningar eller icke-repeterbara läsningar endast kan ske mellan flera uttalanden - inte inom en enskild påstående.
För databas som inte implementerar MVCC korrekt och som förlitar sig på låsning för att hantera samtidighet (och därmed blockerar samtidig skrivåtkomst) kan detta faktiskt ge felaktiga resultat om tabellen uppdateras samtidigt. För dem lösningen med <
behövs förmodligen.