Die DISTINCT-Klausel in PostgreSQL

Bilal Shahid 15 Februar 2024
  1. Einführung in die DISTINCT-Klausel in PostgreSQL
  2. Verwendung der DISTINCT-Klausel in PostgreSQL
  3. Verwendung der DISTINCT ON-Klausel in PostgreSQL
Die DISTINCT-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:

eindeutige Klausel in postgresql - Ausgabe eins

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:

distinkte Klausel in postgresql - Ausgabe zwei

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:

distinkte Klausel in postgresql - Ausgabe drei

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;

distinkte Klausel in postgresql - Ausgabe drei

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:

distinkte Klausel in postgresql - Ausgabe vier

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:

distinkte Klausel in postgresql - Ausgabe fünf

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:

distinkte Klausel in postgresql - Ausgabe sechs

Bilal Shahid avatar Bilal Shahid avatar

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