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.