Database
 sql >> Base de Dados >  >> RDS >> Database

Como encontrar valores duplicados em uma tabela SQL


Geralmente, é uma prática recomendada colocar restrições exclusivas em uma tabela para evitar linhas duplicadas. No entanto, você pode se encontrar trabalhando com um banco de dados em que linhas duplicadas foram criadas por erro humano, um bug em seu aplicativo ou dados não limpos de fontes externas. Este tutorial ensinará como encontrar essas linhas duplicadas.

Para acompanhar, você precisará de acesso de leitura ao seu banco de dados e uma ferramenta para consultar seu banco de dados.

Identificar critérios duplicados


A primeira etapa é definir seus critérios para uma linha duplicada. Você precisa que uma combinação de duas colunas seja única ou está simplesmente procurando por duplicatas em uma única coluna? Neste exemplo, estamos procurando duplicatas em duas colunas em nossa tabela Usuários:nome de usuário e email.

Escrever consulta para verificar a existência de duplicatas


A primeira consulta que vamos escrever é uma consulta simples para verificar se realmente existem duplicatas na tabela. Para o nosso exemplo, minha consulta se parece com isso:
SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1

HAVING é importante aqui porque diferente de WHERE , HAVING filtros em funções agregadas.

Se alguma linha for retornada, isso significa que temos duplicatas. Neste exemplo, nossos resultados são assim:
nome de usuário e-mail contagem
Pete [email protected] 2
Jéssica [email protected] 2
Milhas [email protected] 2

Listar todas as linhas que contêm duplicatas


Na etapa anterior, nossa consulta retornou uma lista de duplicatas. Agora, queremos retornar o registro inteiro para cada linha duplicada.

Para fazer isso, precisaremos selecionar a tabela inteira e juntá-la às nossas linhas duplicadas. Nossa consulta fica assim:
SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users 
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email

Se você olhar de perto, verá que essa consulta não é tão complicada. O SELECT inicial simplesmente seleciona cada coluna na tabela de usuários e, em seguida, une-a internamente com a tabela de dados duplicada de nossa consulta inicial. Como estamos unindo a tabela a ela mesma, é necessário usar aliases (aqui, estamos usando a e b) para rotular as duas versões.

Veja como são nossos resultados para esta consulta:
id nome de usuário e-mail
1 Pete [email protected]
6 Pete [email protected]
12 Jéssica [email protected]
13 Jéssica [email protected]
2 Milhas [email protected]
9 Milhas [email protected]

Como esse conjunto de resultados inclui todos os IDs de linha, podemos usá-lo para nos ajudar a desduplicar as linhas posteriormente.