Minha tabela está assim:
+-----------+
| id | <- primary key
| time | <- DateTime
| row2 | <- varchar
| row3 |
| ... |
+-----------+
Desejo remover todas as entradas, exceto uma, que está dentro de um período de uma hora inteira e tem o mesmo valor de linha2 (linha2 distinta). É possível fazer isso sem um procedimento armazenado e/ou código não SQL?
A solução usual para esse problema é primeiro procurar as linhas que você deseja manter e, em seguida, excluir todas as outras. A primeira parte pode ser realizada com um agregado e agrupamento:
Então você pode escrever o seu
DELETE
:Existem variações para esse tema: você pode usar uma
NOT EXISTS
construção em vez deNOT IN
(com as alterações apropriadas) ou uma junção usando a palavra-USING
chave.Em 22 de fevereiro de 2011, respondi a uma pergunta sobre uma consulta DELETE usando uma cláusula WHERE contra ela mesma: ( Problema com a subconsulta do MySQL ).
Aqui está uma abordagem mais segura:
Aqui está o SQL real:
Você pode executar esses comandos como estão ou colocá-los em um procedimento armazenado.
Embora eu dê +1 à resposta de dezso porque funciona mecanicamente no Oracle, PostgreSQL e SQL Server, tire-o de um MySQL DBA, não confio na abordagem do MySQL para otimização interna do SQL por meio de transformação ao fazer um DELETE em uma tabela contra si mesmo. É por isso que enviei esta resposta.