Excluindo registros repetidos em uma tabela
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.
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.
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.
Vou explicar as partes do código:
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.
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.
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.
Seria interessante colocar um exemplo desses, mais pra o MySQL... mas, ficou excelente o artigo. Parabéns!
17/07/2009 12:39pm
(~15 anos atrás)
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
(~15 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
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
(~15 anos atrás)