DELETE FROM student
WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime)
FROM student s2
WHERE s2.StudentID = student.StudentID)
Vzhledem k dlouhé diskusi v komentářích mějte na paměti následující:
Výše uvedené prohlášení bude pracovat na jakékoli databázi, která správně implementuje konzistenci čtení na úrovni příkazu bez ohledu na jakékoli změny v tabulce, když je příkaz spuštěn.
Databáze, u kterých rozhodně vím, že to funguje správně i se souběžné úpravy tabulky:Oracle (ten, kterého se týká tato otázka), Postgres, SAP HANA, Firebird (a pravděpodobně MySQL pomocí InnoDB). Protože všechny zaručují konzistentní pohled na data v okamžiku zahájení výpisu. Změna <>
na <
pro ně nic nezmění (včetně Oracle, kterého se tato otázka týká)
U výše uvedených databází toto tvrzení není podléhá úrovni izolace, protože fantomové čtení nebo neopakovatelné čtení může nastat pouze mezi více prohlášení – nikoli v rámci jednoho prohlášení.
U databáze, která neimplementuje správně MVCC a spoléhá na zamykání pro správu souběžnosti (a tím blokuje souběžný přístup k zápisu), to může ve skutečnosti vést k nesprávným výsledkům, pokud je tabulka aktualizována souběžně. Pro ty, řešení pomocí <
je pravděpodobně potřeba.