In Oracle Database, de INTERSECT
operator wordt gebruikt om een samengestelde query te maken die het snijpunt retourneert van de resultaten van de linker en rechter SELECT
verklaringen. Met andere woorden, het combineert twee query's, maar retourneert alleen die rijen die in beide query's worden geretourneerd.
Voorbeeld
Stel dat we de volgende tabellen hebben:
SELECT * FROM Employees;
SELECT * FROM Customers;
Resultaat:
WERKNEMER-ID | NAAM WERKNEMER |
---|---|
1 | Bart |
2 | Jan |
3 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
KLANT-ID | NAAM KLANT |
---|---|
1 | Mia |
2 | Rohit |
3 | Peter |
4 | Ava |
5 | Monish |
6 | Monish |
We kunnen de INTERSECT
. gebruiken operator om werknemers terug te sturen die ook klant zijn:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Resultaat:
NAAM WERKNEMER |
---|
Ava |
Monish |
Rohit |
Het retourneert dus alleen die waarden die voorkomen in zowel de Employees
tabel en de Customers
tafel.
Oracle Database's implementatie van de INTERSECT
operator retourneert alleen afzonderlijke rijen. We kunnen dit zien in het bovenstaande voorbeeld. Het retourneert slechts één rij voor Monish, ook al zijn er meerdere werknemers en meerdere klanten met die naam.
Sommige RDBMS'en stellen ons in staat om duplicaten in het resultaat op te nemen door een optionele ALL
. te accepteren trefwoord met de INTERSECT
operator, maar Oracle is daar niet een van (tenminste, niet op het moment van schrijven). SQLite ook niet.
Een alternatieve zoekopdracht
Het is mogelijk om hetzelfde resultaat te krijgen zonder de INTERSECT
exploitant. We zouden ons eerste voorbeeld hier bijvoorbeeld naar kunnen herschrijven:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Resultaat:
NAAM WERKNEMER |
---|
Rohit |
Ava |
Monish |
Enkele dingen om te onthouden
Houd er rekening mee dat de expressies in aantal moeten overeenkomen en zich in dezelfde gegevenstypegroep moeten bevinden. Daarom kunnen we het volgende niet doen:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;
Resultaat:
ORA-01789: query block has incorrect number of result columns
Of dit:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;
Resultaat:
ORA-01790: expression must have same datatype as corresponding expression
We kunnen echter functies gebruiken zoals TO_CHAR()
om een kolom te converteren naar een geschikte gegevenstypegroep:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;
Resultaat:
no data found
In dit geval zijn er geen gegevens gevonden omdat geen van de CustomerId
waarden kwamen overeen met een van de EmployeeName
waarden. Maar als ze dat deden, zouden we de wedstrijden zien.