sql >> Databasteknik >  >> RDS >> Oracle

Ta bort alla poster utom den senaste?

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 <> till < 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.



  1. Charlotte SQL Server User Group:Fixa långsamma frågor. Snabb.

  2. Skapa en databas i SQL Server 2017

  3. Hur lägger man till inledande nolla i ett nummer i Oracle SQL-fråga?

  4. PostgreSQL felaktig sortering