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.