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

Funktionsweise von INTERSECT in PostgreSQL

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