Problem:
Du har dublerede rækker i din tabel, hvor kun ID'erne er unikke. Hvordan finder du disse duplikerede poster?
Eksempel:
Vores database har en tabel med navnet product
med data i følgende kolonner:id
, name
og category
.
id | navn | kategori |
---|---|---|
1 | bøf | kød |
2 | kage | slik |
3 | d>bøf | kød |
4 | svinekød | kød |
5 | kage | slik |
6 | kage | slik |
Lad os finde duplikerede navne og produktkategorier. Du kan finde dubletter ved at gruppere rækker ved at bruge COUNT
aggregeret funktion og specificering af en HAVING
klausul, som rækker skal filtreres med.
Løsning:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Denne forespørgsel returnerer kun duplikerede poster – dem, der har samme produktnavn og kategori:
navn | kategori |
---|---|
bøf | kød |
kage | slik |
Der er to duplikerede produkter i vores tabel:bøf fra kødkategorien og kage fra slikkategorien. Det første produkt gentages to gange i tabellen, mens det andet vises tre gange.
Diskussion:
For at vælge dublerede værdier skal du oprette grupper af rækker med de samme værdier og derefter vælge grupperne med et antal større end én. Det kan du opnå ved at bruge GROUP BY
og en HAVING
klausul.
Det første trin er at oprette grupper af poster med de samme værdier i alle ikke-ID-kolonner (i vores eksempel, name
og category
). Det gør du med en GROUP BY
klausul. Efter GROUP BY
nøgleord, sætter du navnene på de kolonner, du vil bruge til gruppering. Vi ekskluderer id
kolonne, fordi det er vores tabels primære nøgle; pr. definition vil hver række have en anden værdi under den kolonne. Hvis vi skulle inkludere det, så ville vi ikke være i stand til at opdage dubletter!
Vi ønsker at finde grupper med mere end én række; sådanne grupper skal pr. definition indeholde en dublet, så længe vi har grupperet på de korrekte kolonner. For at gøre dette bruger vi en HAVING
klausul. Betingelsen vi angiver er, at antallet af elementer i gruppen—COUNT(id)
—skal være større end én:COUNT(id) > 1
. Husk at HAVING
giver dig mulighed for at filtrere grupper; WHERE
er til filtrering af individuelle rækker.