terça-feira, 15 de julho de 2008

Removendo Registros Duplicados

Segue um procedimento simples, fácil e comentado para remoção de resgistros duplicados de uma tabela.Basta você adaptá-lo ao seu caso, escolhendo qual o critério de duplicação. No exemplo estamos usando os campos ID, NOME E SALARIO. Script para criaçao de uma tabela fictícia, para então podermos realizar nossos testes:

CREATE TABLE [dbo].[Funcionarios] (
[id] [int] NULL ,
[nome] [Varchar] (50) NULL,
[salario] [Numeric](18, 2) NULL
) ON [PRIMARY]

GO

-- populando a tabela com registros duplicados
Insert into Funcionarios values (1,'Rambo', 1000.00)
Insert into Funcionarios values (1,'Rambo', 1000.00)
Insert into Funcionarios values (2,'Joelson', 1000.00)
Insert into Funcionarios values (2,'Joelson', 1000.00)
Insert into Funcionarios values (3,'Blue Mary', 1000.00)
Insert into Funcionarios values (4,'Mary Julie', 5000.00)
Insert into Funcionarios values (2,'Joelson', 1000.00)
Insert into Funcionarios values (1,'Rambo', 1000.00)

-- Verificando os registros duplicados
SELECT * FROM [dbo].[Funcionarios] ORDER BY nome

Agora basta executar o procedimento de exclusão de registros duplicados.


DECLARE @DupCount INT
SET @DupCount = 0

-- Conta os itens duplicados
SELECT
@DupCount = COUNT(*)
FROM
Funcionarios
GROUP BY id, nome, salario
HAVING COUNT(*) > 1

-- Executa um WHILE onde iremos excluir cada um dos registros duplicados
WHILE @DupCount > 0
BEGIN
SET ROWCOUNT 1

-- Exclui as duplicações de acordo com os critérios do filtro (ID, nome e salario)
DELETE Funcionarios
FROM Funcionarios
JOIN (
SELECT id, nome, salario
FROM Funcionarios
GROUP BY id, nome, salario
HAVING COUNT(*) > 1
) Funcionarios_ALIAS
ON Funcionarios.id = Funcionarios_ALIAS.id
AND Funcionarios.nome = Funcionarios_ALIAS.nome
AND Funcionarios.salario = Funcionarios_ALIAS.salario

SET ROWCOUNT 0

-- Conto quantos registros duplicados ainda existem e atribuo o resultado ao contador
SELECT
@DupCount = COUNT(*)
FROM (SELECT *
FROM Funcionarios
GROUP BY id, nome, salario
HAVING COUNT(*) > 1
) TAB
END

Executamos um select para verificar o resultado da exclusão

SELECT * FROM [dbo].[Funcionarios] ORDER BY nome

É isso ai. Até a proxima.

Nenhum comentário: