sql >> Base de Datos >  >> RDS >> Oracle

¿Eliminar todos los registros excepto el más reciente?

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

Dada la larga discusión en los comentarios, tenga en cuenta lo siguiente:

La declaración anterior será trabajar en cualquier base de datos que implemente correctamente la consistencia de lectura a nivel de declaración, independientemente de cualquier cambio en la tabla mientras se ejecuta la declaración.

Bases de datos donde definitivamente sé que esto funciona correctamente incluso con modificaciones simultáneas a la tabla:Oracle (de la que trata esta pregunta), Postgres, SAP HANA, Firebird (y muy probablemente MySQL usando InnoDB). Porque todos garantizan una vista consistente de los datos en el momento en que comenzó la declaración. Cambiando el <> a < no cambiará nada para ellos (incluido Oracle, de lo que trata esta pregunta)

Para las bases de datos mencionadas anteriormente, la declaración es no sujeto al nivel de aislamiento porque las lecturas fantasma o las lecturas no repetibles solo pueden ocurrir entre múltiples declaraciones - no dentro de un single declaración.

Para la base de datos que no implementa MVCC correctamente y depende del bloqueo para administrar la concurrencia (bloqueando así el acceso de escritura simultáneo), esto podría generar resultados incorrectos si la tabla se actualiza simultáneamente. Para aquellos, la solución alternativa usando < probablemente sea necesario.