Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Alle Datensätze außer dem neuesten löschen?

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

Angesichts der langen Diskussion in den Kommentaren beachten Sie bitte Folgendes:

Die obige Aussage wird funktionieren auf jeder Datenbank, die die Lesekonsistenz auf Anweisungsebene ordnungsgemäß implementiert, unabhängig von Änderungen an der Tabelle, während die Anweisung ausgeführt wird.

Datenbanken, bei denen ich definitiv weiß, dass dies auch mit korrekt funktioniert Gleichzeitige Änderungen an der Tabelle:Oracle (um die es in dieser Frage geht), Postgres, SAP HANA, Firebird (und höchstwahrscheinlich MySQL mit InnoDB). Denn sie alle garantieren eine konsistente Sicht auf die Daten zum Zeitpunkt des Abrechnungsbeginns. Ändern des <> zu < wird nichts für sie ändern (einschließlich Oracle, um das es in dieser Frage geht)

Für die oben genannten Datenbanken ist die Aussage nicht unterliegen der Isolationsstufe, da Phantomlesevorgänge oder nicht wiederholbare Lesevorgänge nur zwischen mehreren auftreten können Anweisungen - nicht innerhalb einer einzelnen Erklärung.

Bei Datenbanken, die MVCC nicht ordnungsgemäß implementieren und sich auf Sperren verlassen, um die Parallelität zu verwalten (wodurch der gleichzeitige Schreibzugriff blockiert wird), kann dies tatsächlich zu falschen Ergebnissen führen, wenn die Tabelle gleichzeitig aktualisiert wird. Für diese der Workaround mit < wird wohl benötigt.