Die DISTINCT-Klausel in PostgreSQL
-
Einführung in die
DISTINCT
-Klausel in PostgreSQL -
Verwendung der
DISTINCT
-Klausel in PostgreSQL -
Verwendung der
DISTINCT ON
-Klausel in PostgreSQL
Dieses Tutorial veranschaulicht die Verwendung der DISTINCT
-Klausel anhand verschiedener Codebeispiele. Außerdem wird gezeigt, wie diese Klausel für die gesamte Tabelle und einen bestimmten Satz von Attributen verwendet wird.
Einführung in die DISTINCT
-Klausel in PostgreSQL
Wir wissen, dass wir, wenn wir alle Zeilen einer Tabelle anzeigen möchten, eine einfache SELECT
-Anweisung verwenden können. Nehmen wir also an, wir haben die folgende Tabelle:
Create table sample ( Number int not null);
Lassen Sie uns nun einige Daten in diese Beispieltabelle einfügen:
Insert into sample values (100), (200), (300), (100);
Wenn wir nun eine einfache SELECT * FROM sample
-Abfrage auf dieser Datenbank ausführen, erhalten wir die folgende Ausgabe, die alle Zeilen anzeigt:
Kannst du sehen, was hier passiert? Der Wert 100
wird zweimal gedruckt, da er beim Einfügen wiederholt wird. Was ist, wenn wir eindeutige Werte anzeigen möchten? Gibt es eine Möglichkeit, dies in PostgreSQL zu tun?
Ja, die Klausel DISTINCT
ermöglicht es uns, Duplikate aus dem Ergebnis einer Abfrage herauszufiltern und nur einmal anzuzeigen. Im Folgenden lernen wir im Detail DISTINCT
und DISTINCT ON
in PostgreSQL kennen.
Verwendung der DISTINCT
-Klausel in PostgreSQL
Die Klausel DISTINCT
in einer SELECT
-Anweisung entfernt alle doppelten Zeilenwerte aus dem Ergebnis. Von den identischen Werten wird nur einer angezeigt, sodass sich kein Wert in der Ausgabe wiederholt.
Lassen Sie uns die Syntax der DISTINCT
-Klausel untersuchen, indem wir sie auf die oben definierte Beispiel
-Tabelle anwenden.
SELECT DISTINCT * FROM sample;
Wir erhalten die folgende Ausgabe, indem wir diese Abfrage ausführen:
Hast du den Unterschied bemerkt? Jetzt wird der Wert 100
nur noch einmal statt zweimal in einer einfachen SELECT
-Anweisung angezeigt. Das ist die Macht der DISTINCT
-Klausel.
Nachdem Sie nun die Verwendung der Klausel DISTINCT
verstanden haben, wollen wir ein weiteres Szenario vorstellen. Angenommen, wir haben die folgende Tabelle:
Create table example(
Id int not null,
Number int not null,
Constraint PK2 primary key (id)
);
Insert into example values (1, 100), (2, 200), (3, 300), (4, 100);
Wenn wir jetzt ein einfaches SELECT * FROM example;
Abfrage erhalten wir die folgende Ausgabe, die alle Zeilen anzeigt:
Wir können sehen, dass sich der Wert 100
wie erwartet wiederholt. Lassen Sie uns die Klausel DISTINCT
verwenden, wie wir oben gelernt haben:
SELECT DISTINCT * FROM example;
Es hat nicht funktioniert! Wir erhalten immer noch die gleiche Ausgabe. Alle Zeilen mit dem Wert 100
werden nicht dupliziert, wenn sie zusammen mit id
als Ganzes behandelt werden.
Sie sind einzigartig, weil der Wert von id
in beiden unterschiedlich ist und sie daher in der Ausgabe angezeigt werden. Wie umgehen wir das also?
Haben wir eine Möglichkeit, Duplikate aus bestimmten Attributen herauszufiltern? Ja, die Klausel DISTINCT ON
ermöglicht uns dies in PostgreSQL.
Verwendung der DISTINCT ON
-Klausel in PostgreSQL
Die Klausel DISTINCT ON
ermöglicht es uns, doppelte Werte bestimmter Attribute aus dem Ergebnis einer SELECT
-Abfrage zu entfernen, indem nur das erste Vorkommen des Werts angezeigt wird.
Auf diese Weise wird, selbst wenn die Werte der anderen Attribute in den Zeilen unterschiedlich sind, nur die erste erkannte Zeile angezeigt. Es hat die folgende Syntax:
DISTINCT ON (attribute1, attribute2,…)
Lassen Sie uns die Syntax und Funktionsweise der DISTINCT ON
-Klausel verstehen, indem Sie die folgende Abfrage auf die oben definierte example
-Tabelle ausführen.
SELECT DISTINCT ON (number) * FROM example;
Es gibt die folgende Ausgabe:
Der doppelte Wert 100
ist weg! Wir können also sehen, dass wie erwartet nur die erste Zeile mit dem sich wiederholenden Wert number
in der Ausgabe angezeigt wird. Der kritische Punkt ist, dass die erste Reihe nicht immer vorhersehbar ist.
Dies bedeutet, dass die Abfrage möglicherweise bei jeder Ausführung eine andere Ausgabe zurückgibt, was ein Problem darstellen kann. Daher ist es eine gute Praxis, es zusammen mit der Klausel ORDER BY
zu verwenden.
Die Klausel ORDER BY
ermöglicht es Ihnen, die Daten basierend auf einem oder mehreren Attributen aus der Tabelle zu sortieren. Mit diesem Satz von Attributen können wir in absteigender oder aufsteigender Reihenfolge sortieren.
Sehen wir uns an, wie die Klausel ORDER BY
mit der Klausel DISTINCT ON
verwendet wird, indem die folgende Abfrage verwendet wird:
SELECT DISTINCT ON (number) * FROM example
ORDER BY number, id DESC;
Die Ausführung dieser Abfrage gibt uns die folgende Ausgabe:
Wir können sehen, dass jetzt die letzte Zeile als einziges wiederholtes Vorkommen angezeigt wird.
Da wir die Zeilen in absteigender Reihenfolge nach id
geordnet haben, erscheint die letzte Zeile mit id
als 4
zuerst und wird als erstes Vorkommen behandelt.
Sie müssen jedoch bemerkt haben, dass wir, obwohl wir die Zeilen nach id
sortieren wollten, immer noch number
als erstes Attribut in der ORDER BY
-Klausel angegeben haben.
PostgreSQL erfordert, dass das Attribut oder die Attribute ganz links, die in der Klausel ORDER BY
angegeben sind, mit denen übereinstimmen müssen, die in der Klausel DISTINCT ON
geschrieben sind. Es ist nur eine Anforderung von PostgreSQL.
Wenn wir es analysieren, können wir sehen, dass es die Ergebnisse der doppelten Zeilen nicht stört, da die Attribute ganz links dieselben Werte haben. Daher werden die Zeilen automatisch nach den folgenden Attributen geordnet.
In diesem Fall hatte number
den genauen Wert 100
, also wurden die Zeilen nach dem folgenden Attribut geordnet, also id
. Lassen Sie uns versuchen, die folgende Abfrage auszuführen, von der wir wissen, dass sie einen Fehler ausgeben wird:
SELECT DISTINCT ON (number) * FROM example
ORDER BY id DESC;
Wie erwartet erhalten wir folgenden Fehler:
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub