Jota Comm

SQL and Linux

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

2 Respostas para “Removendo registros duplicados”

  1. Daniel Cruz disse

    Não faltou um HAVING COUNT(*) > 1?

  2. 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

Deixe uma resposta

XHTML: Você pode usar estas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>