+2

Excluindo registros repetidos em uma tabela

criado por Pedro Almeida em 16/07/2009 10:46pm
Varias vezes encontramos a seguinte situação: temos uma tabela no banco de dados que apresenta registros duplicados.
Vou ensinar a voces como deixar apenas um destes registros, eliminando a duplicidade ao excluir os demais.

A primeira operação a ser feita é criar uma tabela auxiliar com a mesma estrutura e informações da tabela em que vamos remover as duplicidades. Para melhor entendimento da lição vamos criar duas tabelas, elas servirão para exemplificar a situação de duplicidade, sendo a tabela1 sua tabela original e a tabela2 sua tabela auxiliar.

create table tabela1(
  codigo integer,
  nome char(30)
);

create table tabela2(
  codigo integer,
  nome char(30)
);

Com as tabelas criadas vamos alimentar a tabela1 com varios registros duplicados, depois de alimentada copie todas as informações inseridas na tabela1 para tabela2.

insert into tabela2
select * from tabela1;


Com as tabelas identicas vamos fazer o uso de um comando SQL chamado Rowid, este comando identifica a linha de uma tabela independente de chaves primarias e etc, dessa forma podemos diferenciar informações identicas que não seriam possiveis de diferenciar usando as próprias informações da tabela.

Agora vamos definitavamente construir a instrução SQL que nos possibilita remover as duplicidades.

delete from tabela1
where tabela1.codigo in (select distinct tabela1.codigo 
                           from tabela1                  
                       group by tabela1.codigo 
                         having count(*) > 1)
  and rowid <> (select max(rowid) 
                  from tabela2 
                 where tabela2.codigo = tabela1.codigo);

Vou explicar as partes do código:

where tabela1.codigo in (select distinct tabela1.codigo 
                           from tabela1                  
                       group by tabela1.codigo 
                         having count(*) > 1);

Com isso estamos eliminando os codigos que não estão duplicados, a sub query, por sua vez, retorna todos os codigos duplicados, assim usando o comando in obtemos somente os registros duplicados da query principal.

  and rowid <> (select max(rowid) 
                  from tabela2 
                 where tabela2.codigo = tabela1.codigo);

O pulo do gato fica aqui, selecionamos na sub query o ultimo rowid do codigo corrente da tabela auxiliar, assim deletaremos todos os registros da tabela principal em que o rowid for diferente do ultimo.

Comentários:

Mostrando 1 - 3 de 3 comentários
Seria interessante colocar um exemplo desses, mais pra o MySQL... mas, ficou excelente o artigo. Parabéns!
17/07/2009 12:39pm (~7 anos atrás)

Pedro Almeida disse:
João, o Mysql não possui o comando ROWID, impossibilitando esse tipo de operação porem temos o ROWID nos bancos Oracle, MSSql, Postgree e Informix. Outros bancos também devem possuir este recurso porem citei os bancos em que trabalhei e usei essa funcionalidade.
17/07/2009 12:15pm (~7 anos atrás)

Pedro,

Muito legal o artigo, mas esse comando/keyword "rowid" é do MySQL? Eu nunca tinha ouvido falar nisso, então estou imaginando que isso é coisa do Oracle ou PostgreSQL.

Pode clarificar isso?

--Joao
17/07/2009 11:37am (~7 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)