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