Probleem:
U heeft dubbele rijen in uw tabel, waarbij alleen de ID's uniek zijn. Hoe vind je die dubbele vermeldingen?
Voorbeeld:
Onze database heeft een tabel met de naam product
met gegevens in de volgende kolommen:id
, name
, en category
.
id | naam | categorie |
---|---|---|
1 | biefstuk | vlees |
2 | taart | snoepjes |
3 | d>biefstuk | vlees |
4 | varkensvlees | vlees |
5 | taart | snoepjes |
6 | taart | snoepjes |
Laten we dubbele namen en productcategorieën vinden. U kunt duplicaten vinden door rijen te groeperen met behulp van de COUNT
aggregatiefunctie, en het specificeren van een HAVING
clausule om rijen te filteren.
Oplossing:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Deze zoekopdracht levert alleen dubbele records op:records met dezelfde productnaam en categorie:
naam | categorie |
---|---|
biefstuk | vlees |
taart | snoepjes |
Er zijn twee dubbele producten in onze tabel:biefstuk uit de categorie vlees en cake uit de categorie zoetigheden. Het eerste product wordt twee keer herhaald in de tabel, terwijl het tweede drie keer voorkomt.
Discussie:
Als u dubbele waarden wilt selecteren, moet u groepen rijen met dezelfde waarden maken en vervolgens de groepen selecteren waarvan het aantal groter is dan één. U kunt dat bereiken door GROUP BY
. te gebruiken en een HAVING
clausule.
De eerste stap is het maken van groepen records met dezelfde waarden in alle niet-ID-kolommen (in ons voorbeeld name
en category
). Dit doe je met een GROUP BY
clausule. Na de GROUP BY
trefwoord, zet u de namen van de kolommen die u wilt gebruiken voor groepering. We sluiten de id
uit kolom omdat het de primaire sleutel van onze tabel is; per definitie heeft elke rij een andere waarde onder die kolom. Als we het zouden opnemen, zouden we geen duplicaten kunnen detecteren!
We willen groepen vinden met meer dan één rij; dergelijke groepen moeten per definitie een duplicaat bevatten, zolang we maar op de juiste kolommen hebben gegroepeerd. Om dit te doen, gebruiken we een HAVING
clausule. De voorwaarde die we specificeren is dat het aantal elementen in de groep—COUNT(id)
—moet groter zijn dan één:COUNT(id) > 1
. Onthoud dat HAVING
stelt u in staat om groepen te filteren; WHERE
is voor het filteren van individuele rijen.