Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Excluir todos os registros, exceto o mais recente?

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.