sql >> Database >  >> RDS >> Oracle

Alle records verwijderen behalve de meest recente?

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

Houd rekening met het volgende, gezien de lange discussie in de opmerkingen:

De bovenstaande verklaring zal werk aan elke database die leesconsistentie op instructieniveau correct implementeert, ongeacht eventuele wijzigingen in de tabel terwijl de instructie wordt uitgevoerd.

Databases waarvan ik zeker weet dat dit correct werkt, zelfs met gelijktijdige wijzigingen aan de tabel:Oracle (degene waar deze vraag over gaat), Postgres, SAP HANA, Firebird (en hoogstwaarschijnlijk MySQL met InnoDB). Omdat ze allemaal garant staan ​​voor een consistent beeld van de gegevens op het moment dat de verklaring begon. De <> wijzigen naar < zal niets voor hen veranderen (inclusief Oracle waar deze vraag over gaat)

Voor de bovengenoemde databases is de instructie niet onderhevig aan het isolatieniveau omdat phantom reads of niet-herhaalbare reads alleen kunnen plaatsvinden tussen meerdere uitspraken - niet binnen een enkele uitspraak.

Voor databases die MVCC niet correct implementeren en afhankelijk zijn van vergrendeling om gelijktijdigheid te beheren (waardoor gelijktijdige schrijftoegang wordt geblokkeerd), kan dit in feite verkeerde resultaten opleveren als de tabel gelijktijdig wordt bijgewerkt. Voor degenen die de tijdelijke oplossing gebruiken met < waarschijnlijk nodig is.



  1. Hoe het MySQL-rootwachtwoord opnieuw in te stellen

  2. dplyr left_join met kleiner dan, groter dan voorwaarde

  3. Onderhoudstaken voor SQL-databases automatiseren met SQLCMD

  4. OTA instellen in R12 en 11i