EXCLUIR REGISTROS DUPLICADOS NO SQL SERVER
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
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
Sugiro fazer um join implÃÂcito, ou seja, um join com ela mesma:
Mais ou menos por aÃÂ.
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ÃÂ.
Não entendi,
e a exclusão da duplicidades na tabela original onde entra?
e a exclusão da duplicidades na tabela original onde entra?
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]
[txt-color=#007100]Para ÃÂmpar[/txt-color]
[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
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.
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.
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
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
Aqui tem um bom exemplo:
viniciusfonsecadba.wordpress.com/2018/12/11/apagando-registros-duplicados-no-sql-server/
Ou usar o segundo método dos exemplos dado pela microsoft:
docs.microsoft.com/pt-br/troubleshoot/sql/database-design/remove-duplicate-rows-sql-server-tab#:~:text=Se%20sua%20l%C3%B3gica%20para%20excluir,ORDER%20BY%20para%20fazer%20isso.
viniciusfonsecadba.wordpress.com/2018/12/11/apagando-registros-duplicados-no-sql-server/
Ou usar o segundo método dos exemplos dado pela microsoft:
docs.microsoft.com/pt-br/troubleshoot/sql/database-design/remove-duplicate-rows-sql-server-tab#:~:text=Se%20sua%20l%C3%B3gica%20para%20excluir,ORDER%20BY%20para%20fazer%20isso.
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...
coloquei ids auto incremento bem aleatórios e funcionou igual
O da Microsoft é bem semelhante
este comando não conhecia:
with cte as
(select...
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)
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