Problème :
Vous avez des lignes en double dans votre table, seuls les ID étant uniques. Comment trouvez-vous ces entrées en double ?
Exemple :
Notre base de données a une table nommée product
avec des données dans les colonnes suivantes :id
, name
, et category
.
identifiant | nom | catégorie |
---|---|---|
1 | steak | viande |
2 | gâteau | bonbons |
3 | d>steak | viande |
4 | porc | viande |
5 | gâteau | bonbons |
6 | gâteau | bonbons |
Trouvons les noms et les catégories de produits en double. Vous pouvez trouver des doublons en regroupant des lignes, en utilisant le COUNT
fonction d'agrégation et en spécifiant un HAVING
clause avec laquelle filtrer les lignes.
Solution :
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Cette requête renvoie uniquement les enregistrements en double, ceux qui ont le même nom de produit et la même catégorie :
nom | catégorie |
---|---|
steak | viande |
gâteau | bonbons |
Il y a deux produits en double dans notre tableau :le steak de la catégorie viande et le gâteau de la catégorie sucreries. Le premier produit est répété deux fois dans le tableau, tandis que le second apparaît trois fois.
Discussion :
Pour sélectionner des valeurs en double, vous devez créer des groupes de lignes avec les mêmes valeurs, puis sélectionner les groupes dont le nombre est supérieur à un. Vous pouvez y parvenir en utilisant GROUP BY
et un HAVING
clause.
La première étape consiste à créer des groupes d'enregistrements avec les mêmes valeurs dans toutes les colonnes non ID (dans notre exemple, name
et category
). Vous faites cela avec un GROUP BY
clause. Après le GROUP BY
mot-clé, vous mettez les noms des colonnes que vous souhaitez utiliser pour le regroupement. Nous excluons le id
colonne parce que c'est la clé primaire de notre table; par définition, chaque ligne aura une valeur différente sous cette colonne. Si nous devions l'inclure, nous ne serions pas en mesure de détecter les doublons !
Nous voulons trouver des groupes avec plus d'une ligne ; ces groupes doivent contenir un doublon par définition, tant que nous avons regroupé sur les bonnes colonnes. Pour ce faire, nous utilisons un HAVING
clause. La condition que nous spécifions est que le nombre d'éléments dans le groupe—COUNT(id)
—doit être supérieur à un :COUNT(id) > 1
. Rappelez-vous que HAVING
vous permet de filtrer les groupes ; WHERE
sert à filtrer des lignes individuelles.