EXCLUIR REGISTROS DUPLICADOS NO SQL SERVER

JCM0867 24/04/2022 11:44:38
#499688
Olá pessoal

Tenho a seguinte tabela:

id Campo1 campo2 Campo 3
1 AAA BB0 CC0
2 AAA BB0 CC0
3 AA1 BB1 CC1
4 AA1 BB1 CC1
5 AA2 BB2 CC2
6 AA2 BB2 CC2
7 AA3 BB3 CC3
8 AA3 BB3 CC3

como dou um delete para excluir: o 2, 4, 6 e 8
ou o 1, 3, 5 e 7
o id é auto incremento e pode ser qualquer valor o que interessa são as duplicidades.

O resultado ficaria
id Campo1 campo2 Campo 3
2 AA0 BB0 CC0
4 AA1 BB1 CC1
6 AA2 BB2 CC2
8 AA3 BB3 CC3

Eu poderia tirar o incremento e dar um distinct para uma nova tabela, colocar um auto incremento novamente excluir a tabela com duplicidade e renomear a tabela nova.
Mas só o ato de excluir a tabela com duplicidade por alguns minutos e depois recoloca-la poderia dar pau pq certamente estão usando.

Tem algo que posso fazer noo sql para excluir estas duplicidades? O valor no incremento Id nesse caso não importa


Grato
KERPLUNK 24/04/2022 17:48:49
#499689
Sugiro fazer um join implícito, ou seja, um join com ela mesma:

select campo1, campo2, campo3 from tabela a inner join tabela b on a.campo1 = b.campo1
inner join tabela c on a.campo2 = c.campo2
inner join tabela d on a.campo3 = d.campo3


Mais ou menos por aí.
JCM0867 24/04/2022 19:19:12
#499690
Não entendi,
e a exclusão da duplicidades na tabela original onde entra?
JABA 24/04/2022 19:34:23
#499691
Resposta escolhida
Se essa lógica de duplicação permanece até o último registro da tabela, então voce pode excluir apenas os registros ímpares ou pares, da seguinte forma:

[txt-color=#007100]Para par[/txt-color]
Delete from tabela where (Id % 2) = 0



[txt-color=#007100]Para ímpar[/txt-color]
Delete from tabela where (Id % 2) > 0

JCM0867 24/04/2022 22:11:20
#499692
Opa,
Interessante teu script, mas não se aplica a minha situação e nem todos são duplicados
pode existir uma duplicidade com id impar e Par
Veja um exemplo de tabela:

create table tab_dup (Id int IDENTITY(1,1), Cod int, col1 varchar(20), col2 varchar(20))

-- insere registros
insert into tab_dup (cod,col1,col2)
values
(1,"vinicius","fonseca"),
(2,"maria","fonseca"),
(3,"joao","fonseca"),
(4,"jose","fonseca"),
(5,"carlos","fonseca"),
(6,"lunis","fonseca"),
(1,"vinicius","fonseca"),
(1,"vinicius","fonseca"),
(2,"maria","fonseca"),
(5,"carlos","fonseca")

nem o Apagar Par e nem o Apagar Impar dará certo. É dificil, mas já teve até registro triplicado
Se conseguir somente para duplicados 2x já ajuda muito.
JCM0867 24/04/2022 22:33:06
#499693
Ache!
A quem interessar:
[txt-color=#0000f0]
with cte as
(select id, col1, col2, row_number() over (partition by id, col1, col2 order by id) linha from tab_dup )
delete from cte where linha > 1[/txt-color]

Resultado da tabela acima:

id Cod Col1 Col2
--------------------------------------
1 1 vinicius fonseca
2 2 maria fonseca
3 3 joao fonseca
4 4 jose fonseca
5 5 carlos fonseca
6 6 lunis fonseca
JCM0867 24/04/2022 22:57:41
#499695
Opa, foi aí mesmo que achei. inclusive usei o exemplo dele aqui. Diferença que ele não colocou um auto incremento, coloquei para testar.
coloquei ids auto incremento bem aleatórios e funcionou igual
O da Microsoft é bem semelhante

este comando não conhecia:
with cte as
(select...

KERPLUNK 24/04/2022 23:14:33
#499696
Com um select daqueles que te passei, voce pode isolar os ids que quer deletar e usar eles como parâmetro da clausula IN:

Delete from Tabela Where id IN (SELECT bla bla bla)
JCM0867 24/04/2022 23:29:59
#499697
Citação:

:
Com um select daqueles que te passei, voce pode isolar os ids que quer deletar e usar eles como parâmetro da clausula IN:


Delete from Tabela Where id IN (SELECT bla bla bla)



O problema seria montar corretamente o bla, bla, bla...rs

Mas valeu pelos dois Oráculos do canal. O Jaba está quase...rs
Estava fazendo isso na unha, ordenava e apagava os repetidos um por um. e as vezes eram dezenas. que tragédia.
Tópico encerrado , respostas não são mais permitidas