V databázi Oracle je to INTERSECT operátor se používá k vytvoření složeného dotazu, který vrací průnik výsledků levého a pravého SELECT prohlášení. Jinými slovy, kombinuje dva dotazy, ale vrací pouze ty řádky, které jsou vráceny v obou dotazech.
Příklad
Předpokládejme, že máme následující tabulky:
SELECT * FROM Employees;
SELECT * FROM Customers; Výsledek:
| ID ZAMĚSTNANCE | EMPLOYEENAME |
|---|---|
| 1 | Bart |
| 2 | Leden |
| 3 | Ava |
| 4 | Rohit |
| 5 | Monština |
| 6 | Monština |
| 7 | Monština |
| CUSTOMERID | JMÉNO ZÁKAZNÍKA |
|---|---|
| 1 | Mia |
| 2 | Rohit |
| 3 | Petr |
| 4 | Ava |
| 5 | Monština |
| 6 | Monština |
Můžeme použít INTERSECT operátor vrátit zaměstnance, kteří jsou zároveň zákazníky:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; Výsledek:
| JMÉNO ZAMĚSTNANCE |
|---|
| Ava |
| Monština |
| Rohit |
Vrací tedy pouze hodnoty, které se objevují v obou Employees tabulky a Customers stůl.
Implementace INTERSECT Oracle Database operátor vrací pouze odlišné řádky. Můžeme to vidět na výše uvedeném příkladu. Vrátí pouze jeden řádek pro Monish, i když existuje více zaměstnanců a více zákazníků s tímto jménem.
Některé RDBMS nám umožňují zahrnout duplikáty do výsledku přijetím volitelného ALL klíčové slovo s INTERSECT operátor, ale Oracle mezi ně nepatří (alespoň ne v době psaní). Ani SQLite.
Alternativní dotaz
Stejný výsledek je možné získat i bez použití INTERSECT operátor. Například bychom mohli přepsat náš první příklad na toto:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); Výsledek:
| JMÉNO ZAMĚSTNANCE |
|---|
| Rohit |
| Ava |
| Monština |
Něco k zapamatování
Všimněte si, že výrazy se musí shodovat v počtu a musí být ve stejné skupině datových typů. Proto nemůžeme udělat následující:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers; Výsledek:
ORA-01789: query block has incorrect number of result columns
Nebo toto:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers; Výsledek:
ORA-01790: expression must have same datatype as corresponding expression
Můžeme však použít funkce jako TO_CHAR() převést sloupec na vhodnou skupinu datových typů:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers; Výsledek:
no data found
V tomto případě nebyla nalezena žádná data, protože žádné z CustomerId hodnoty odpovídaly jakémukoli z EmployeeName hodnoty. Ale pokud ano, pak bychom viděli zápasy.