Removendo registros duplicados

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

Anúncios

Publicado em 24 de outubro de 2008, em PostgreSQL e marcado como , . Adicione o link aos favoritos. 2 Comentários.

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

  2. 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 um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: