Eu tenho um banco de dados de organizações do SQL Server e há muitas linhas duplicadas. Desejo executar uma instrução select para capturar tudo isso e a quantidade de enganos, mas também retornar os IDs associados a cada organização.
Uma declaração como:
SELECT orgName, COUNT(*) AS dupes
FROM organizations
GROUP BY orgName
HAVING (COUNT(*) > 1)
Retornará algo como
orgName | dupes
ABC Corp | 7
Foo Federation | 5
Widget Company | 2
Mas eu também gostaria de pegar os IDs deles. Há alguma maneira de fazer isso? Talvez como um
orgName | dupeCount | id
ABC Corp | 1 | 34
ABC Corp | 2 | 5
...
Widget Company | 1 | 10
Widget Company | 2 | 2
O motivo é que também há uma tabela separada de usuários vinculados a essas organizações, e eu gostaria de unificá-los (portanto, remova os dupes para que os usuários se vinculem à mesma organização em vez de dupe orgs). Mas gostaria de fazer parte manualmente para não estragar nada, mas ainda assim precisaria de uma declaração retornando os IDs de todas as organizações duplas para que eu possa percorrer a lista de usuários.
fonte
isnull()
para colunas anuláveis naon
seçãoVocê pode executar a seguinte consulta e encontrar as duplicatas com
max(id)
e excluir essas linhas.Mas você precisará executar essa consulta algumas vezes.
fonte
MAX( COUNT(*) ) - 1
vezes, o que ainda pode ser possível.Você pode fazer assim:
Se você deseja retornar apenas os registros que podem ser excluídos (deixando um de cada), você pode usar:
Editar: o SQL Server 2000 não possui a função ROW_NUMBER (). Em vez disso, você pode usar:
fonte
A solução marcada como correta não funcionou para mim, mas achei esta resposta que funcionou muito bem: Obtenha uma lista de linhas duplicadas no MySql
fonte
n1.id > n2.id
impedirá que cada par seja exibido duas vezes.Você pode tentar isso, é melhor para você
fonte
Se você deseja excluir duplicatas:
fonte
Para encontrar o Registro 1 duplicado) Usando CTE
2) Usando GroupBy
fonte
Portanto, os registros com rowum> 1 serão os registros duplicados na sua tabela. Primeiro, agrupe pelos registros e os serialize, dando-lhes os números de série. Portanto, rownum> 1 serão os registros duplicados que podem ser excluídos como tais.
fonte
Src: https://stackoverflow.com/a/59242/1465252
fonte
fonte
fonte
Você tem várias maneiras de selecionar
duplicate rows
.para minhas soluções, primeiro considere esta tabela, por exemplo
Primeira solução:
Solução completa:
identity
campo de usoe final de toda solução, use este comando
fonte
Eu acho que sei o que você precisa, eu precisava misturar as respostas e acho que consegui a solução que ele queria:
ter o ID máximo fornecerá o ID do publicador e o do original, que ele solicitou:
única coisa triste que você colocá-lo nesta forma
espero que ainda ajude
fonte
Suponha que tenhamos a tabela 'Student' com 2 colunas:
student_id int
student_name varchar
Agora queremos ver registros duplicados Use esta consulta:
fonte
Eu tenho uma opção melhor para obter os registros duplicados em uma tabela
O resultado da consulta acima mostra todos os nomes duplicados com IDs de alunos exclusivos e número de ocorrências duplicadas
Clique aqui para ver o resultado do sql
fonte
fonte
Eu uso dois métodos para encontrar linhas duplicadas. O primeiro método é o mais famoso usando grupo por e tendo. O segundo método está usando CTE - Common Table Expression .
Conforme mencionado pelo @RedFilter, esse caminho também é correto. Muitas vezes acho que o método CTE também é útil para mim.
No exemplo acima, coletamos o resultado localizando ocorrência repetida usando ROW_NUMBER e PARTITION BY. Em seguida, aplicamos a cláusula where para selecionar apenas as linhas que estão na contagem de repetição superior a 1. Todo o resultado é coletado na tabela CTE e associado à tabela Organizações.
Fonte: CodoBee
fonte
Experimentar
fonte