В 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
стойности. Но ако го направиха, тогава щяхме да видим мачовете.