Problem:
Sie haben doppelte Zeilen in Ihrer Tabelle, wobei nur die IDs eindeutig sind. Wie finden Sie diese doppelten Einträge?
Beispiel:
Unsere Datenbank hat eine Tabelle namens product
mit Daten in den folgenden Spalten:id
, name
, und category
.
id | Name | Kategorie |
---|---|---|
1 | Steak | Fleisch |
2 | Kuchen | Süßigkeiten |
3 | d>Steak | Fleisch |
4 | Schweinefleisch | Fleisch |
5 | Kuchen | Süßigkeiten |
6 | Kuchen | Süßigkeiten |
Lassen Sie uns doppelte Namen und Kategorien von Produkten finden. Sie können Duplikate finden, indem Sie Zeilen mit COUNT
gruppieren Aggregatfunktion und Angabe eines HAVING
Klausel, mit der Zeilen gefiltert werden.
Lösung:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Diese Abfrage gibt nur doppelte Datensätze zurück – solche mit demselben Produktnamen und derselben Kategorie:
name | Kategorie |
---|---|
Steak | Fleisch |
Kuchen | Süßigkeiten |
In unserer Tabelle gibt es zwei doppelte Produkte:Steak aus der Kategorie Fleisch und Kuchen aus der Kategorie Süßigkeiten. Das erste Produkt wird in der Tabelle zweimal wiederholt, das zweite dreimal.
Diskussion:
Um doppelte Werte auszuwählen, müssen Sie Gruppen von Zeilen mit denselben Werten erstellen und dann die Gruppen mit einer Anzahl größer als eins auswählen. Sie können dies erreichen, indem Sie GROUP BY
verwenden und ein HAVING
Klausel.
Der erste Schritt besteht darin, Gruppen von Datensätzen mit denselben Werten in allen Nicht-ID-Spalten zu erstellen (in unserem Beispiel name
und category
). Das machst du mit einem GROUP BY
Klausel. Nach dem GROUP BY
Schlüsselwort geben Sie die Namen der Spalten ein, die Sie für die Gruppierung verwenden möchten. Wir schließen die id
aus Spalte, weil es der Primärschlüssel unserer Tabelle ist; Per Definition hat jede Zeile unter dieser Spalte einen anderen Wert. Wenn wir es einschließen würden, könnten wir keine Duplikate entdecken!
Wir wollen Gruppen mit mehr als einer Zeile finden; Solche Gruppen müssen per Definition ein Duplikat enthalten, solange wir nach den richtigen Spalten gruppiert haben. Dazu verwenden wir einen HAVING
Klausel. Die Bedingung, die wir angeben, ist die Anzahl der Elemente in der Gruppe – COUNT(id)
– muss größer als eins sein:COUNT(id) > 1
. Denken Sie daran, dass HAVING
ermöglicht das Filtern von Gruppen; WHERE
dient zum Filtern einzelner Zeilen.