PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionsweise von EXCEPT in PostgreSQL

In PostgreSQL ist das EXCEPT -Operator gibt Zeilen zurück, die von der linken Eingabeabfrage zurückgegeben werden, die von der rechten Eingabeabfrage nicht zurückgegeben werden. Dies kann auch als Unterschied bezeichnet werden zwischen zwei Abfragen.

Syntax

Die Syntax lautet wie folgt:

query1 EXCEPT [ALL] query2

Duplikate werden eliminiert, es sei denn EXCEPT ALL verwendet wird.

Beispiel

Angenommen, wir haben die folgenden Tabellen:

SELECT * FROM Teachers;
SELECT * FROM Students;

Ergebnis:

 teacherid | teachername 
-----------+-------------
         1 | Warren
         2 | Ben
         3 | Cathy
         4 | Cathy
         5 | Bill
         6 | Bill

 studentid | studentname 
-----------+-------------
         1 | Faye
         2 | Jet
         3 | Spike
         4 | Ein
         5 | Warren
         6 | Bill

Wir können den EXCEPT verwenden Operator, um Lehrer zurückzugeben, die nicht gleichzeitig Schüler sind:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Ergebnis:

 teachername 
-------------
 Cathy
 Ben

Wir erhalten also nur Werte, die in Teachers vorkommen Tabelle, die nicht auch in den Students erscheinen Tisch.

Standardmäßig ist die EXCEPT -Operator gibt eindeutige Zeilen zurück. In unserem Beispiel wird also nur eine Zeile für Cathy zurückgegeben , obwohl es zwei Lehrer mit diesem Namen gibt.

Das obige Beispiel entspricht der folgenden Abfrage:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Ergebnis:

 teachername 
-------------
 Cathy
 Ben

Dies ist das gleiche Ergebnis, das wir erhalten haben, als es kein explizites DISTINCT gab Stichwort. Wir können Duplikate mit dem ALL einschließen Schlüsselwort (dazu später mehr).

Wir können unterschiedliche Ergebnisse erhalten, je nachdem, welche Tabelle links und welche rechts ist. Hier ist ein Beispiel, das Students einfügt Tisch links und Teachers rechts:

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Ergebnis:

 studentname 
-------------
 Faye
 Jet
 Spike
 Ein

Diesmal bekommen wir Schüler, die nicht gleichzeitig Lehrer sind.

Duplikate einschließen

Standardmäßig ist die EXCEPT Operator wendet implizit ein DISTINCT an Betrieb. Mit anderen Worten, es gibt standardmäßig nur eindeutige Werte zurück.

Wir können ALL einschließen Stichwort, um Duplikate in unser Ergebnis aufzunehmen:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Ergebnis:

 teachername 
-------------
 Cathy
 Cathy
 Bill
 Ben

Dieses Mal haben wir vier Zeilen statt der zwei, die wir in unserem ersten Beispiel bekommen haben.

Wir können sehen, dass beide Cathys zurückgegeben wurden und nicht nur eine wie in unserem ersten Beispiel.

Was Bill angeht? Es gibt zwei Rechnungen in den Teachers Tabelle, aber hier wird nur eine zurückgegeben. Das liegt wahrscheinlich daran, dass es eine Rechnung in den Students gibt Tabelle, die eine der Rechnungen aus unseren Ergebnissen ausschließen würde.

Eine Alternative

Es ist möglich, das gleiche Ergebnis zu erhalten, ohne EXCEPT zu verwenden Operator. Zum Beispiel könnten wir unser erstes Beispiel so umschreiben:

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

Ergebnis:

 teachername 
-------------
 Cathy
 Ben