Removendo registros duplicados
Publicado por jotacomm em 24/10/2008
Olá, pessoal
Muitas vezes temos tabelas sem chaves primárias (nada recomendável) e com registros duplicados.
Uma pergunta que normalmente surge é: Como fazer para deletar estes registros? Uma solução possível é:
DELETE FROM tabela WHERE tabela.ctid NOT IN (SELECT max(tabela.ctid) FROM tabela GROUP BY tabela.codigo) RETURNING codigo;
Observação 1: O parâmetro RETURNING está disponível a partir da versão 8.2.
Observação 2: Uma boa prática é executar comandos do tipo UPDATE/DELETE dentro de um bloco de transação [1].
[1] http://www.postgresql.org/docs/8.3/interactive/mvcc-intro.html
Fiquem a vontade para comentários.
[]s
Daniel Cruz disse
Não faltou um HAVING COUNT(*) > 1?
jotacomm disse
Grande Cristian
Não é necessário usar o HAVING COUNT(*)>1.
No comando “SELECT max(tabela.ctid) FROM tabela GROUP BY tabela.codigo)” é selecionado o maior ctid de cada codigo. Depois é executado o comando DELETE para deletar somente os ctids não selecionados para aquele código.
[]s