27 fevereiro 2009

[SQL SERVER] Deletando registros duplicados

Vamos supor que você está usando o SQL Server 2005 no seu atual projeto, e você achou que algumas linhas com os dados iguais em todas as colunas. Vamos considerar que você tenha uma tabela com nome "Exemplo" e as colunas ID e Nome.

jessecerqueira

Você pode ver que os registros com nome Jessé e Cerqueira estão duplicados. A consulta abaixo retorna apenas os registros duplicados

SELECT
[ID],[NOME],COUNT([ID])
FROM
[Exemplo]
GROUP BY
[ID],[NOME]
HAVING
COUNT([ID]) > 1

Vamos supor que você precise excluir o registro com valor (1, 'Jessé'), de modo que apenas uma linha continue.

DELETE TOP(1) FROM [Exemplo] WHERE [ID] = 1

Usando o Top(1) é possível excluir apenas o primeiro registro, em situações como no exemplo acima, que tem apenas um registro a mais. Se você tiver várias linhas com valores duplicados, você tem que usar TOP (n-1) para que apenas 1 linha permaneça após o delete. Para apagar todos os registros duplicados que você precisa para escrever um cursor como no exemplo abaixo.

DECLARE @ID int
DECLARE @NOME NVARCHAR(50)
DECLARE @CONT int

DECLARE CUR_DELETE CURSOR FOR
SELECT [ID],[NOME],COUNT([ID]) FROM [Exemplo] GROUP BY [ID],[NOME] HAVING COUNT([ID]) > 1

OPEN CUR_DELETE

FETCH NEXT FROM CUR_DELETE INTO @ID,@NOME,@CONT
WHILE @@FETCH_STATUS = 0
BEGIN

DELETE TOP(@CONT -1) FROM [Exemplo] WHERE ID = @ID

FETCH NEXT FROM CUR_DELETE INTO @ID,@NOME,@CONT
END

CLOSE CUR_DELETE
DEALLOCATE CUR_DELETE

7 comentários:

Cristiano Joaquim disse...

Fala Jessé, boa tarde.
Eu testei este cursor que você apresentou no Blob, que apaga registros duplicados, no dia 27-02-2009, porém não obtive resultado. Ou seja, não houve exclusão dos registros na tabela que estou testando.

Anônimo disse...

Muito bom, fantástico, funcionou perfeitamente, procurei por isso por muito tempo e nunca achei um funcionasse.
Parabéns Jessé e obrigado.
Marcelo

Anônimo disse...

Fala Jessé, só uma coisa , no caso de string é a mesma coisa?
tenho uma tabela de emails, e tem algumas duplicações e até triplicações, como eu faço pra deletar e manter apenas 1 registro?
agradeço a ajuda desde já

abs

viniblessing disse...

Valew brodher!!! vc acaba de salvar meu pescoço :).

Anônimo disse...

Show de Bola , quebrou um galho e tanto :)

UNDERGROUND PEAPLE disse...

obrigado amigão ajudou-me a resolver um problema de dados repetidos numa tabela de uma das bases de dados da empresa em q trabalho. ganhei o dia amigão
continue ajudando a malta cá em angola com carencia de books e informação detalhada.saudações.

Julio disse...

Cara preciso fazer a mesma coisa mas deixar o registro mais recente baseado no campo data de criação, como eu faria?

Abs