In PostgreSQL der INTERSECT
-Operator kombiniert zwei Abfragen, gibt aber nur die Zeilen zurück, die in beiden Abfragen zurückgegeben werden.
Syntax
Die Syntax lautet wie folgt:
query1 INTERSECT [ALL] query2
Duplikate werden eliminiert, es sei denn INTERSECT ALL
verwendet wird.
Beispiel
Angenommen, wir haben die folgenden Tabellen:
SELECT * FROM Employees;
SELECT * FROM Customers;
Ergebnis:
employeeid | employeename ------------+-------------- 1 | Bart 2 | Jan 3 | Ava 4 | Rohit 5 | Monish 6 | Monish 7 | Monish customerid | customername ------------+-------------- 1 | Mia 2 | Rohit 3 | Peter 4 | Ava 5 | Monish 6 | Monish
Wir können den INTERSECT
verwenden Betreiber, um Mitarbeiter zurückzugeben, die auch Kunden sind:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Ergebnis:
employeename -------------- Ava Rohit Monish
Wir erhalten also nur Werte, die in Employees
vorkommen Tabelle, die auch in Customers
erscheinen Tisch.
Standardmäßig werden unterschiedliche Zeilen zurückgegeben, sodass für Monish nur eine Zeile zurückgegeben wird, obwohl es mehrere Mitarbeiter und mehrere Kunden mit diesem Namen gibt.
Es ist dasselbe wie hier:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Ergebnis:
employeename -------------- Ava Rohit Monish
Wir erhalten also dasselbe Ergebnis wie ohne DISTINCT
Betreiber.
Duplikate einschließen
Wie bereits erwähnt, der INTERSECT
-Operator gibt standardmäßig nur eindeutige Werte zurück. Aber wir können ALL
hinzufügen Schlüsselwort zum Einschließen von Duplikaten:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Ergebnis:
employeename -------------- Ava Rohit Monish Monish
Dieses Mal haben wir vier Zeilen statt der drei, die wir in unserem ersten Beispiel bekommen haben.
Wir können sehen, dass zwei Zeilen mit dem Namen Monish zurückgegeben wurden, anstatt nur einer wie in unserem ersten Beispiel. Es gibt tatsächlich drei Kunden namens Monish, aber nur zwei Mitarbeiter mit diesem Namen. Daher schneidet die Operation nur zwei davon.
Eine alternative Abfrage
Es ist möglich, dasselbe Ergebnis ohne Verwendung von INTERSECT
zu erhalten Operator. Zum Beispiel könnten wir unser erstes Beispiel so umschreiben:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Ergebnis:
employeename -------------- Ava Rohit Monish