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

Vil du slette alle poster undtagen den seneste?

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

I betragtning af den lange diskussion i kommentarerne, bemærk venligst følgende:

Ovenstående erklæring vil arbejde på enhver database, der korrekt implementerer læsekonsistens på sætningsniveau uanset eventuelle ændringer i tabellen, mens sætningen kører.

Databaser hvor jeg helt sikkert ved at dette fungerer korrekt selv med samtidige ændringer af tabellen:Oracle (den, som dette spørgsmål handler om), Postgres, SAP HANA, Firebird (og sandsynligvis MySQL ved hjælp af InnoDB). Fordi de alle garanterer et ensartet syn på dataene på det tidspunkt, hvor erklæringen startede. Ændring af <> til < vil ikke ændre noget for dem (inklusive Oracle, som dette spørgsmål handler om)

For ovennævnte databaser er erklæringen ikke underlagt isolationsniveauet, fordi fantomlæsninger eller ikke-gentagelige læsninger kun kan ske mellem flere udsagn - ikke inden for en enkelt udmelding.

For databaser, der ikke implementerer MVCC korrekt og er afhængige af låsning for at administrere samtidighed (derved blokerer samtidig skriveadgang), kan dette faktisk give forkerte resultater, hvis tabellen opdateres samtidigt. For dem løsningen ved hjælp af < er sandsynligvis nødvendig.



  1. Oracle-sekvens, der starter med 2 i stedet for 1

  2. Få antallet af dage i en måned i PostgreSQL

  3. Gendannelse af slettet 'root'-bruger og adgangskode til MySQL

  4. Slut dig til os for en introduktion til adgang med SQL Server