sql >> Database >  >> RDS >> Database

Hoe dubbele rijen in SQL te vinden?

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.


  1. Selecteer de tweede meest minimale waarde in Oracle

  2. Wat te controleren in MySQL 8.0

  3. Beperking voor slechts één record gemarkeerd als standaard

  4. Hibernate-toewijzing tussen PostgreSQL-enum en Java-enum