sql >> Databáze >  >> RDS >> Oracle

Smazat všechny záznamy kromě nejnovějšího?

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.



  1. Získejte poslední den v měsíci v SQL

  2. Nasazení a údržba PostgreSQL s Ansible

  3. Jak zkopírujete záznam v tabulce SQL, ale vyměníte jedinečné ID nového řádku?

  4. PostgreSQL parametrizované Order By / Limit v tabulkové funkci