DELETE FROM student
WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime)
FROM student s2
WHERE s2.StudentID = student.StudentID)
Dada a longa discussão nos comentários, observe o seguinte:
A declaração acima vai funcionam em qualquer banco de dados que implemente corretamente a consistência de leitura no nível da instrução, independentemente de quaisquer alterações na tabela enquanto a instrução estiver em execução.
Bancos de dados onde eu definitivamente sei que isso funciona corretamente mesmo com modificações simultâneas na tabela:Oracle (aquele sobre o qual esta pergunta é sobre), Postgres, SAP HANA, Firebird (e provavelmente MySQL usando InnoDB). Porque todos eles garantem uma visão consistente dos dados no momento em que a instrução começou. Alterando o
<>
para <
não mudará nada para eles (incluindo a Oracle sobre a qual esta pergunta é) Para os bancos de dados mencionados acima, a declaração é não sujeito ao nível de isolamento porque leituras fantasmas ou leituras não repetíveis só podem ocorrer entre múltiplos declarações - não dentro de um único demonstração.
Para bancos de dados que não implementam o MVCC corretamente e dependem de bloqueio para gerenciar a simultaneidade (bloqueando assim o acesso de gravação simultâneo), isso pode realmente gerar resultados errados se a tabela for atualizada simultaneamente. Para aqueles que usam a solução alternativa
<
é provavelmente necessário.