В Oracle Database INTERSECT операторът се използва за създаване на сложна заявка, която връща пресечната точка на резултатите от левия и десния SELECT изявления. С други думи, той комбинира две заявки, но връща само онези редове, които са върнати и в двете заявки.
Пример
Да предположим, че имаме следните таблици:
SELECT * FROM Employees;
SELECT * FROM Customers; Резултат:
| ИД НА СЛУЖИТЕЛ | EMPLOYEENAME |
|---|---|
| 1 | Барт |
| 2 | Януари |
| 3 | Ава |
| 4 | Рохит |
| 5 | Мониш |
| 6 | Мониш |
| 7 | Мониш |
| ИД НА КЛИЕНТ | CUSTOMERNAME |
|---|---|
| 1 | Миа |
| 2 | Рохит |
| 3 | Петър |
| 4 | Ава |
| 5 | Мониш |
| 6 | Мониш |
Можем да използваме INTERSECT оператор да върне служители, които също са клиенти:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; Резултат:
| EMPLOYEENAME |
|---|
| Ава |
| Мониш |
| Рохит |
Така че връща само тези стойности, които се появяват и в Employees таблицата и Customers маса.
Реализацията на INTERSECT от Oracle Database операторът връща само отделни редове. Можем да видим това в горния пример. Връща само един ред за Monish, въпреки че има множество служители и множество клиенти с това име.
Някои RDBMS ни позволяват да включваме дубликати в резултата, като приемем незадължителен ALL ключова дума с INTERSECT оператор, но Oracle не е един от тях (поне не към момента на писане). Нито SQLite.
Алтернативна заявка
Възможно е да получите същия резултат, без да използвате INTERSECT оператор. Например, можем да пренапишем първия си пример на това:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); Резултат:
| EMPLOYEENAME |
|---|
| Рохит |
| Ава |
| Мониш |
Някои неща, които трябва да запомните
Обърнете внимание, че изразите трябва да съвпадат по брой и трябва да са в една и съща група тип данни. Следователно не можем да направим следното:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers; Резултат:
ORA-01789: query block has incorrect number of result columns
Или това:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers; Резултат:
ORA-01790: expression must have same datatype as corresponding expression
Въпреки това можем да използваме функции като TO_CHAR() за да преобразувате колона в подходяща група данни:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers; Резултат:
no data found
В този случай не бяха открити данни, тъй като нито един от CustomerId стойностите съвпадаха с което и да е от EmployeeName стойности. Но ако го направиха, тогава щяхме да видим мачовете.