Oracle
 sql >> база данни >  >> RDS >> Oracle

Обяснение на оператора на Oracle INTERSECT

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Идентифициране на съдържанието на ASH последователност в RAC

  2. Съхранена процедура в Java срещу съхранена процедура в PL/SQL

  3. Как да клонирате потребител в Oracle

  4. Как да украсите изхода, идващ от заявката SELECT в командния ред?

  5. 2 функции, които връщат месеца от дата в Oracle