Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle INTERSECT-Operator erklärt

In der Oracle-Datenbank der INTERSECT -Operator wird verwendet, um eine zusammengesetzte Abfrage zu erstellen, die die Schnittmenge der Ergebnisse des linken und rechten SELECT zurückgibt Aussagen. Mit anderen Worten, es kombiniert zwei Abfragen, gibt aber nur die Zeilen zurück, die in beiden Abfragen zurückgegeben werden.

Beispiel

Angenommen, wir haben die folgenden Tabellen:

SELECT * FROM Employees;
SELECT * FROM Customers;

Ergebnis:

MITARBEITERID MITARBEITERNAME
1 Bart
2 Januar
3 Ava
4 Rohit
5 Monisch
6 Monisch
7 Monisch
KUNDENID KUNDENNAME
1 Mia
2 Rohit
3 Peter
4 Ava
5 Monisch
6 Monisch

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:

MITARBEITERNAME
Ava
Monisch
Rohit

Es gibt also nur die Werte zurück, die in beiden Employees vorkommen Tabelle und die Customers Tisch.

Implementierung von INTERSECT durch Oracle Database -Operator gibt nur eindeutige Zeilen zurück. Wir können dies im obigen Beispiel sehen. Es gibt nur eine Zeile für Monish zurück, obwohl es mehrere Mitarbeiter und mehrere Kunden mit diesem Namen gibt.

Einige RDBMS erlauben es uns, Duplikate in das Ergebnis aufzunehmen, indem wir einen optionalen ALL akzeptieren Schlüsselwort mit dem INTERSECT Betreiber, aber Oracle ist keiner von ihnen (zumindest nicht zum Zeitpunkt des Schreibens). SQLite auch nicht.

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:

MITARBEITERNAME
Rohit
Ava
Monisch

Einige Dinge, an die man sich erinnern sollte

Beachten Sie, dass die Ausdrücke zahlenmäßig übereinstimmen und sich in derselben Datentypgruppe befinden müssen. Daher können wir Folgendes nicht tun:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;

Ergebnis:

ORA-01789: query block has incorrect number of result columns

Oder dies:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Ergebnis:

ORA-01790: expression must have same datatype as corresponding expression

Obwohl wir Funktionen wie TO_CHAR() verwenden können um eine Spalte in eine geeignete Datentypgruppe umzuwandeln:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;

Ergebnis:

no data found

In diesem Fall wurden keine Daten gefunden, weil keine der CustomerId Werte mit einem der EmployeeName übereinstimmten Werte. Aber wenn doch, dann würden wir die Übereinstimmungen sehen.