INTERSECT в Oracle SQL. Введение
Оператор INTERSECT в Oracle SQL используется для получения пересечения результатов двух SELECT-запросов. Он возвращает только те строки, которые есть одновременно в обеих выборках. Дубликаты по умолчанию удаляются, как и в UNION. Это удобный способ выявить совпадающие записи из разных источников или по разным условиям.
🖋️ Синтаксис оператора INTERSECT
SELECT ... FROM ...
INTERSECT
SELECT ... FROM ...;
- SELECT-запросы должны возвращать одинаковое количество столбцов и совместимые типы
- Результат содержит только уникальные строки, которые присутствуют в обеих выборках
Пример:
SELECT employee_id FROM employees
INTERSECT
SELECT employee_id FROM managers;
🔄 Где используется INTERSECT в Oracle SQL
- Поиск совпадающих значений из разных таблиц
- Проверка, кто одновременно состоит в двух группах
- Сравнение результата разных фильтров
- Анализ пересечения между клиентами, пользователями, записями
📊 Примеры использования INTERSECT в Oracle SQL (1–50 из 50)
- Общие ID сотрудников и менеджеров:
SELECT employee_id FROM employees
INTERSECT
SELECT employee_id FROM managers;
- Совпадающие имена из двух таблиц:
SELECT name FROM employees
INTERSECT
SELECT name FROM ex_employees;
- Пересечение по email:
SELECT email FROM newsletter_subscribers
INTERSECT
SELECT email FROM registered_users;
- Пользователи, сделавшие покупку и оформившие возврат:
SELECT user_id FROM purchases
INTERSECT
SELECT user_id FROM returns;
- Товары, участвующие в двух распродажах:
SELECT product_id FROM sale_jan
INTERSECT
SELECT product_id FROM sale_feb;
- Студенты, зарегистрированные в двух курсах:
SELECT student_id FROM course_a
INTERSECT
SELECT student_id FROM course_b;
- Пересечение по дате создания:
SELECT created_at FROM audit_log_2022
INTERSECT
SELECT created_at FROM audit_log_2023;
- Общее между двумя отделами:
SELECT last_name FROM employees WHERE department_id = 10
INTERSECT
SELECT last_name FROM employees WHERE department_id = 20;
- Общие номера заказов:
SELECT order_number FROM orders_archive
INTERSECT
SELECT order_number FROM orders_current;
- Пересечение логинов по дате:
SELECT user_id FROM logins WHERE login_date > SYSDATE - 30
INTERSECT
SELECT user_id FROM logins WHERE login_date < SYSDATE;
- Общие позиции в заказах:
SELECT item_id FROM order_items_2022
INTERSECT
SELECT item_id FROM order_items_2023;
- Пользователи, оплатившие и получившие продукт:
SELECT user_id FROM payments
INTERSECT
SELECT user_id FROM deliveries;
- Пересечение по идентификатору проекта:
SELECT project_id FROM assigned_projects
INTERSECT
SELECT project_id FROM completed_projects;
- Сотрудники, работающие в двух странах:
SELECT employee_id FROM employees WHERE location = 'US'
INTERSECT
SELECT employee_id FROM employees WHERE location = 'UK';
- Дубликаты транзакций по дате:
SELECT transaction_date FROM transactions_jan
INTERSECT
SELECT transaction_date FROM transactions_feb;
- Общие email среди клиентов и сотрудников:
SELECT email FROM customers
INTERSECT
SELECT email FROM employees;
- Слияние активных и недавних пользователей:
SELECT user_id FROM active_users
INTERSECT
SELECT user_id FROM recent_logins;
- Пересечение заказов с возвратами:
SELECT order_id FROM orders
INTERSECT
SELECT order_id FROM returns;
- Сотрудники, уволенные и повторно нанятые:
SELECT employee_id FROM terminations
INTERSECT
SELECT employee_id FROM hires;
- Товары, возвращённые и отгруженные повторно:
SELECT product_id FROM returns
INTERSECT
SELECT product_id FROM re_shipments;
- Участники двух мероприятий:
SELECT person_id FROM event_participants WHERE event_id = 1
INTERSECT
SELECT person_id FROM event_participants WHERE event_id = 2;
- Совпадающие названия в справочниках:
SELECT name FROM directory_1
INTERSECT
SELECT name FROM directory_2;
- Пересечение по коду региона:
SELECT region_code FROM suppliers
INTERSECT
SELECT region_code FROM customers;
- Повторяющиеся номера телефонов:
SELECT phone FROM applicants
INTERSECT
SELECT phone FROM users;
- Общие действия пользователей:
SELECT user_id FROM user_actions WHERE action_type = 'login'
INTERSECT
SELECT user_id FROM user_actions WHERE action_type = 'purchase';
- Сопоставление транзакций по сумме:
SELECT amount FROM transactions_2023
INTERSECT
SELECT amount FROM transactions_2022;
- Совпадение ID между логами:
SELECT session_id FROM login_log
INTERSECT
SELECT session_id FROM error_log;
- Сравнение email по активности:
SELECT email FROM users WHERE last_login > SYSDATE - 30
INTERSECT
SELECT email FROM users WHERE is_active = 'Y';
- Совпадающие product_code в разных складах:
SELECT product_code FROM warehouse_a
INTERSECT
SELECT product_code FROM warehouse_b;
- Совпадение идентификаторов в XML:
SELECT id FROM xml_table_1
INTERSECT
SELECT id FROM xml_table_2;
- Совпадающие строки с типами данных CHAR:
SELECT CAST(code AS CHAR(5)) FROM temp_codes
INTERSECT
SELECT CAST(code AS CHAR(5)) FROM perm_codes;
- Сравнение дат между отчётами:
SELECT report_date FROM monthly_reports
INTERSECT
SELECT report_date FROM quarterly_reports;
- Общие роли пользователей:
SELECT role_name FROM user_roles
INTERSECT
SELECT role_name FROM audit_roles;
- Участники проекта и сотрудники отдела:
SELECT employee_id FROM project_team
INTERSECT
SELECT employee_id FROM employees WHERE department_id = 60;
- Пересечение email между таблицами маркетинга:
SELECT email FROM leads
INTERSECT
SELECT email FROM newsletter_subscribers;
- Сравнение ID в таблице заказов и логистики:
SELECT order_id FROM logistics
INTERSECT
SELECT order_id FROM orders;
- Пересечение времён событий:
SELECT event_time FROM calendar_events
INTERSECT
SELECT event_time FROM booking_slots;
- Совпадающие значения с NULL фильтрацией:
SELECT user_id FROM users WHERE phone IS NOT NULL
INTERSECT
SELECT user_id FROM support_tickets;
- Общее между JSON-таблицами:
SELECT id FROM json_table_a
INTERSECT
SELECT id FROM json_table_b;
- Совпадающие синонимы:
SELECT synonym FROM dictionary_a
INTERSECT
SELECT synonym FROM dictionary_b;
- Общее по пользователям в транзакциях:
SELECT user_id FROM credit_transactions
INTERSECT
SELECT user_id FROM debit_transactions;
- Пересечение по объектам в схемах:
SELECT object_name FROM user_objects
INTERSECT
SELECT object_name FROM all_objects;
- Сравнение времён создания и обновления:
SELECT created_at FROM resources
INTERSECT
SELECT updated_at FROM resources;
- Сопоставление ключей в API логах:
SELECT api_key FROM request_logs
INTERSECT
SELECT api_key FROM error_logs;
- Совпадающие данные между CSV-загрузками:
SELECT record_id FROM csv_upload_1
INTERSECT
SELECT record_id FROM csv_upload_2;
- Пересечение IP-адресов:
SELECT ip_address FROM login_history
INTERSECT
SELECT ip_address FROM blocked_ips;
- Сравнение email среди подписчиков:
SELECT email FROM beta_subscribers
INTERSECT
SELECT email FROM general_subscribers;
- Общие логины среди системных пользователей:
SELECT login FROM sys_users_a
INTERSECT
SELECT login FROM sys_users_b;
- Совпадение времён обновления:
SELECT last_update FROM settings_a
INTERSECT
SELECT last_update FROM settings_b;
- Пересечение сотрудников с бонусами:
SELECT employee_id FROM bonuses
INTERSECT
SELECT employee_id FROM employees;
📆 Заключение: зачем использовать INTERSECT в Oracle SQL
INTERSECT — это лаконичный и эффективный способ найти общее между двумя выборками. Это идеальное решение для проверки пересечений, совпадений, дублирующихся записей или участия в нескольких группах. Он улучшает читаемость и надёжность запроса.
🕸️ Следующая статья:
PIVOT в Oracle SQL — как превращать строки в столбцы для аналитики