[ SQL ] Deletando Registros Duplicados
- domingo, 25 de julho de 2010"Nem sempre temos tudo que queremos"
Cresci ouvindo essa essa frase e hoje ela se mostra ser verdadeira. Nunca fui de me preocupar muito com a consistência do banco de dado pois sempre tinha alguem para fazer isso por mim, acontece que no meu atual emprego, eu acabo fazendo isso mais do que no antigo e mais do que eu imaginei. Não quero que achem que estou reclamando, estou aprendendo um pouco mais de SQL, e isso era realmente preciso. Mas para justificar a frase eu vou dar um exemplo que me aconteceu essa semana.
Recebi uma base de pessoas com aproximadamente 300.000 registros, precisavamos trabalhar esses dados para utilizar em nossa aplicação. Acontece que aproximadamente 10% dos registros estavem em duplicidade e eu fiquei encarregado de limpar e trabalhar a base. Essa é a jstificativa para a frase, seria tudo tão perfeito se a base fosse consistente, os dados ja estivessem no formato que fossemos usar e tudo mais, MAS "Nem sempre temos tudo que queremos".
Bom vamos a solução. Eu implementei uma rotina para limpar a base usando cursor, demorava alguns minutos para deletar todos os registros duplicados. Então conversando com o Marcus, meu colega de trabalho, ele me mostrou uma solução muito mais eficiente. Resolvi implementar a solução do meu colega e o resultado foi o seguinte, eu deletava tudo em 2 segundos e sem usar cursor.
A SOLUÇÂO:
1) Identificar o campo que seria usado para diferenciar os registros, no meu caso o CPF.
2) Criar uma coluna de identificação para cada registro, usei um int com identity.
3) Deletar os Registros em duplicidade de acordo com o ID.
Abaixo segue o script que usei.
-------
/* Insere coluna para servir como identificador */
alter table TabelaTeste
add id int identity
/* deleta os registros duplicados */
delete t from tabelaTeste t where t.id not in (select min(id) from tabelaTeste t_dup where t_dup.cpf = t.cpf )
-------
Estou liberando para download o script completo que:
1) Cria uma tabela com registros duplicados 
2) Insere uma coluna para identificação dos registros
3) deleta todos os registros em duplicidade, deixando apenas um registro para cada CPF.
4) remove a coluna para identificação do registro
[Download do Script]
Espero ter ajudado.
Jabis
-3/3/2011 - 12:35
Muito bom, me ajudou bastante
Rafael Almeida
-29/7/2010 - 17:07
Raphael, muito obrigado pelo comentário. Prendendo manter o blog sempre atualizado.
Raphael
-27/7/2010 - 16:40
Bom tópico, prático, simples e muito didático. Também estou iniciando com SQL Server e tópicos como esses são muito uteis no aprendizado. Obrigado
Rafael Almeida
-26/7/2010 - 9:19
É Tomás como vc me diz, não podemos ser xiitas. Achei legal, postei. HAuHA
Tomás Vásquez
-26/7/2010 - 9:12
Nossa! Um post de SQL aqui! O menino tá contaminado... :D
Ultimos Posts
25/7/2010
16/7/2010
8/7/2010
29/6/2010
8/2/2010
Amigos
Navarro
Klaus
Andre
Danilo
Tomás
Carolina Andrade
Design By Carolina Andrade
Rafael da Silva Almeida, 22 Desenvolvedor;
