Inquiridor
Exclusão de registros duplicados

Pergunta
-
Boa Tarde amigos!!!
gostaria de saber uma maneira eficiente de se excluir registros duplicados em uma tabela, ou seja, se existe um registro duplicado duas vezes ou seja, dois registros com o mesmo ID por exemplo, excluir apenas um deles. como posso fazer isso de forma eficiente?
Muito Obrigado
Todas as Respostas
-
Boa Noite,
Você pode copiar os registros para uma tabela de forma distinta, excluir os registros da tabela principal e posteriormente repopulá-la. Ex:
Code SnippetCREATE
TABLE #tbl (CODIGO INT, NOME VARCHAR(200))INSERT
INTO #tbl VALUES (1, 'Cliente 1')INSERT
INTO #tbl VALUES (1, 'Cliente 1')INSERT
INTO #tbl VALUES (2, 'Cliente 2')INSERT
INTO #tbl VALUES (2, 'Cliente 2')INSERT
INTO #tbl VALUES (2, 'Cliente 2')SELECT
DISTINCT CODIGO, NOME INTO #tbl2 FROM #tblDELETE
FROM #tblINSERT
INTO #tbl SELECT CODIGO, NOME FROM #tbl2DROP
TABLE #tbl2SELECT
CODIGO, NOME FROM #tblDROP
TABLE #tblEssa é uma técnica simples, mas em algumas situações infactível (nem sempre é possível excluir todos os registros da
tabela). Outra sugestão é:
Code SnippetCREATE
TABLE #tbl (CODIGO INT, NOME VARCHAR(200))INSERT
INTO #tbl VALUES (1, 'Cliente 1')INSERT
INTO #tbl VALUES (1, 'Cliente 1')INSERT
INTO #tbl VALUES (2, 'Cliente 2')INSERT
INTO #tbl VALUES (2, 'Cliente 2')INSERT
INTO #tbl VALUES (2, 'Cliente 2')ALTER
TABLE #tbl ADD CriterioDesempate INT IDENTITY(1,1)SELECT
* FROM #tblSELECT
CODIGO, NOME, MIN(CriterioDesempate) AS DESEMPATEFROM
#tblGROUP
BY CODIGO, NOMEDELETE
FROM #tblWHERE
NOT
EXISTS (SELECT
CODIGO, NOME, DESEMPATE FROM(
SELECT
CODIGO, NOME, MIN(CriterioDesempate) AS DESEMPATEFROM
#tblGROUP
BY CODIGO, NOME) AS SUBQWHERE
#tbl.CODIGO = SUBQ.CODIGO AND #tbl.CriterioDesempate = SUBQ.DESEMPATE)SELECT
* FROM #tblALTER
TABLE #tbl DROP COLUMN CriterioDesempateSELECT
* FROM #tblDROP
TABLE #tblObserve que nessa solução, eu adicionei um critério de desempate (os que os teóricos chamam de Tiebreaker). Isso foi necessário para decidir que linha deveria ficar na tabela. Normalmente você não precisará criar esse tipo de critério, pois, provavelmente uma coluna na tabela deverá servir como critério de desempate (tiebreaker). Afinal se duas linhas são exatamente iguais há algo errado.
[ ]s,
Gustavo
-
Olá Bruno,
Uma outra alternativa é vc utilizar o scripts baixo. Neste exemplo, "unico" é a coluna da sua tabela cujo valor deve ser único.
*/ Este script permite localizar e excluir registros duplicados em uma tabela*/
-- Passo1: Verifica os registros duplicados
select unico,count(*)as vezes from TTT group by unico having count(unico)>1--Passo 2: Pega o id máximo para cada registro duplicado
select max(id)as idmaximo,unico from TTT group by unico having count(unico)>1--Passo 3: Exclui os registros duplicadfos
DELETE FROM
p1
--SELECT *
FROM
TTT p1
INNER JOIN
(
SELECT
max(id)as id,unico
FROM
TTT
GROUP BY
unico
HAVING
COUNT(*) > 1
) p2
ON(p1.unico = p2.unico
AND p1.id <> p2.id)um abraço
Nilton Pinheiro
- Sugerido como Resposta Jeferson Medeiros quarta-feira, 19 de janeiro de 2011 19:12
-
-
vinicius
testa com CTE e Rown_number (sql 2005 ou superior)
Declare @tbTEste as table (id int, nome varchar(20)) insert into @tbTEste values (1,'C3Po') insert into @tbTEste values (2,'R2D2') insert into @tbTEste values (3,'YODA') insert into @tbTEste values (4,'YODA') ;with cte_teste as ( select *, ROW_NUMBER() over (partition by nome order by nome) numerador from @tbTEste ) delete from cte_teste where numerador >1 select * from @tbTEste
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Filipe M. Oliveira segunda-feira, 14 de maio de 2012 16:03