В этом учебном материале вы узнаете, как использовать Oracle оператор INTERSECT с синтаксисом и примерами.
Описание
Oracle оператор INTERSECT используется для возврата результатов 2-х или более запросов SELECT. Тем не менее, он возвращает строки, выбранные для всех запросов или наборов данных. Если запись существует в одном запросе, а в другом нет, то она будет исключена из результирующего набора INTERSECT.
Пояснение: Запрос INTERSECT будет возвращать записи в серой затененной области. Эти записи, которые существуют в обоих SELECT 1 и SELECT 2.
Каждый оператор SELECT в INTERSECT должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
Синтаксис
Синтаксис оператора INTERSECT в Oracle/PLSQL:
FROM tables
[WHERE conditions]
INTERSECT
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
Параметры или аргументы
expression1, expression2, ... expression_n
Столбцы или расчеты, которые вы хотите получить.
tables
Таблицы из которых вы хотите получить записи.
WHERE conditions
Необязательный. Условия, которые должны быть выполнены для выбранных записей.
Примечание
В обоих SELECT запросах должно быть одинаковое количество expression и иметь схожие типы данных.
Пример с одним полем
Ниже приведен пример Oracle оператора INTERSECT, который возвращает одно поле с тем же типом данных:
1 2 3 4 5 |
SELECT supplier_id FROM suppliers INTERSECT SELECT supplier_id FROM orders; |
В этом примере INTERSECT, если поле supplier_id находится в таблицах suppliers и orders, то оно будет отображаться в вашем результирующем наборе.
Теперь, давайте усложним наш пример. Далее, добавляя условия WHERE для запроса INTERSECT.
1 2 3 |
SELECT supplier_id FROM suppliers WHERE supplier_id <= 99 INTERSECT SELECT supplier_id FROM orders WHERE quantity > 25; |
В этом примере к каждому из наборов данных было добавлено условие WHERE. Первый набор данных был отфильтрован, так, что из таблицы suppliers в результирующий набор попали только те записи, где supplier_id меньше или равна 99. Второй набор данных отфильтрован так, что из таблицы orders возвращаются только те записи, где количество больше 25.
Пример с несколькими полями
Далее рассмотрим пример того, как использовать в Oracle оператор INTERSECT с более одним полем.
Например:
1 2 3 4 5 6 7 |
SELECT contact_id, last_name, first_name FROM contacts WHERE first_name <> 'John' INTERSECT SELECT customer_id, last_name, first_name FROM customers WHERE customer_id >= 89; |
В этом примере INTERSECT запрос будет возвращать записи из таблицы contacts, в которых значения полей contact_id, last_name и first_name будут соответствовать значениям customer_id, last_name и first_name из таблицы customers.
Имеются условия WHERE для каждого набора данных для дальнейшей фильтрации результатов так, что из таблицы contacts возвращаются только записи, где first_name не John. Из таблицы customers возвращаются записи, где customer_id больше или равен 89.
Пример использования ORDER BY
Ниже приведен пример INTERSECT, который использует ORDER BY:
1 2 3 4 5 6 7 8 |
SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 500 INTERSECT SELECT company_id, company_name FROM companies WHERE company_name in ('Apple', 'Microsoft', 'Oracle') ORDER BY 2; |
Так как имена полей в двух запросах SELECT отличаются, то в операторе ORDER BY выгоднее ссылаться на положение столбцов в результирующем наборе. В этом примере, мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как это обозначено в ORDER BY 2.
Поля supplier_name / company_name находятся в позиции # 2 в результирующем наборе.