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

Como encontrar linhas duplicadas no SQL?

Problema:


Você tem linhas duplicadas em sua tabela, com apenas os IDs sendo exclusivos. Como você encontra essas entradas duplicadas?

Exemplo:


Nosso banco de dados tem uma tabela chamada product com dados nas seguintes colunas:id , name e category .
id nome categoria
1 bife carne
2 bolo doces
3 d>bife carne
4 carne de porco carne
5 bolo doces
6 bolo doces

Vamos encontrar nomes duplicados e categorias de produtos. Você pode encontrar duplicatas agrupando linhas, usando o COUNT função agregada e especificando um HAVING cláusula com a qual filtrar linhas.

Solução:

SELECT  name,
 category,
FROM product
GROUP BY name, category
HAVING COUNT(id) >1;

Essa consulta retorna apenas registros duplicados, que têm o mesmo nome e categoria de produto:
nome categoria
bife carne
bolo doces

Há dois produtos duplicados em nossa tabela:bife da categoria carnes e bolo da categoria doces. O primeiro produto é repetido duas vezes na tabela, enquanto o segundo aparece três vezes.

Discussão:


Para selecionar valores duplicados, você precisa criar grupos de linhas com os mesmos valores e, em seguida, selecionar os grupos com contagens maiores que um. Você pode conseguir isso usando GROUP BY e um HAVING cláusula.

O primeiro passo é criar grupos de registros com os mesmos valores em todas as colunas sem ID (no nosso exemplo, name e category ). Você faz isso com um GROUP BY cláusula. Após o GROUP BY palavra-chave, você coloca os nomes das colunas que deseja usar para o agrupamento. Excluímos o id coluna porque é a chave primária da nossa tabela; por definição, cada linha terá um valor diferente nessa coluna. Se o incluíssemos, não poderíamos detectar duplicatas!

Queremos encontrar grupos com mais de uma linha; esses grupos devem conter uma duplicata por definição, desde que tenhamos agrupado nas colunas corretas. Para fazer isso, usamos um HAVING cláusula. A condição que especificamos é que o número de elementos no grupo—COUNT(id) —deve ser maior que um:COUNT(id) > 1 . Lembre-se que HAVING permite filtrar grupos; WHERE é para filtrar linhas individuais.