UNION в Oracle SQL. Введение
Оператор UNION в Oracle SQL используется для объединения результатов двух или более SELECT-запросов в одну результирующую выборку. Он исключает повторяющиеся строки по умолчанию. Если необходимо сохранить дубликаты — используется UNION ALL. Это мощный способ агрегации данных из разных источников или таблиц с одинаковой структурой.
🖋️ Синтаксис оператора UNION
SELECT ... FROM ...
UNION
SELECT ... FROM ...;
- Количество и типы столбцов в обоих SELECT должны совпадать
- Сортировка применяется только к итоговому набору
Пример:
SELECT name FROM customers
UNION
SELECT name FROM vendors;
🔄 Где используется UNION в Oracle SQL
- Слияние данных из разных таблиц
- Объединение подмножеств для отчетов
- Унификация выборок с разной логикой фильтрации
- Формирование сводной таблицы без создания представления
📊 Примеры использования UNION в Oracle SQL (1–40 из 40)
- Объединение клиентов и поставщиков:
SELECT name FROM customers
UNION
SELECT name FROM vendors;
- Список ID из двух таблиц:
SELECT id FROM employees
UNION
SELECT id FROM managers;
- Объединение с фильтрацией:
SELECT product_name FROM products WHERE category = 'Books'
UNION
SELECT product_name FROM products WHERE price > 1000;
- Использование UNION ALL (с дубликатами):
SELECT region FROM warehouses
UNION ALL
SELECT region FROM stores;
- Объединение email-адресов:
SELECT email FROM users
UNION
SELECT email FROM admins;
- Объединение двух временных таблиц:
SELECT * FROM temp_data_jan
UNION
SELECT * FROM temp_data_feb;
- UNION с датами:
SELECT hire_date FROM employees
UNION
SELECT contract_date FROM contractors;
- Объединение значений с разными фильтрами:
SELECT department_id FROM employees WHERE job_id = 'IT_PROG'
UNION
SELECT department_id FROM employees WHERE salary > 5000;
- Слияние значений с группировкой:
SELECT department_id FROM employees
GROUP BY department_id
UNION
SELECT NULL FROM dual;
- Слияние ID и преобразованных значений:
SELECT TO_CHAR(employee_id) AS id_str FROM employees
UNION
SELECT customer_id FROM customers;
- Объединение таблиц разных лет:
SELECT year, revenue FROM financials_2022
UNION
SELECT year, revenue FROM financials_2023;
- UNION в подзапросе:
SELECT * FROM (
SELECT id FROM clients
UNION
SELECT id FROM partners
);
- Объединение времён событий:
SELECT event_time FROM logs_today
UNION
SELECT event_time FROM logs_archive;
- UNION с сортировкой:
SELECT name FROM employees
UNION
SELECT name FROM freelancers
ORDER BY name;
- Объединение по типу пользователя:
SELECT user_id, 'customer' AS user_type FROM customers
UNION
SELECT user_id, 'admin' FROM admins;
- Объединение строковых значений:
SELECT 'email' AS contact_type, email FROM users
UNION
SELECT 'phone', phone FROM users;
- UNION ALL для подсчёта дубликатов:
SELECT product_id FROM sales
UNION ALL
SELECT product_id FROM returns;
- Слияние транзакций с пометкой:
SELECT id, 'purchase' AS action FROM purchases
UNION
SELECT id, 'refund' FROM refunds;
- Объединение дат событий и заданий:
SELECT created_at FROM tickets
UNION
SELECT scheduled_at FROM tasks;
- UNION с преобразованием чисел в строки:
SELECT TO_CHAR(order_id) FROM orders
UNION
SELECT tracking_code FROM shipments;
- Объединение сотрудников по условиям:
SELECT employee_id FROM employees WHERE hire_date < SYSDATE - 365
UNION
SELECT employee_id FROM employees WHERE salary > 10000;
- Объединение зарплат с бонусами:
SELECT salary FROM employees
UNION
SELECT bonus FROM bonuses;
- Использование UNION в WITH:
WITH unified AS (
SELECT id FROM table_a
UNION
SELECT id FROM table_b
)
SELECT * FROM unified;
- Объединение с фильтрацией по имени:
SELECT name FROM vendors WHERE name LIKE 'A%'
UNION
SELECT name FROM customers WHERE name LIKE 'A%';
- Слияние заказов с разных каналов:
SELECT order_id, 'online' FROM online_orders
UNION
SELECT order_id, 'store' FROM store_orders;
- Объединение логинов из двух систем:
SELECT username FROM system_a_logins
UNION
SELECT username FROM system_b_logins;
- Сравнение результатов двух выборок:
SELECT DISTINCT region FROM sales_q1
UNION
SELECT DISTINCT region FROM sales_q2;
- UNION с CASE:
SELECT id, CASE WHEN status = 'Y' THEN 'Active' ELSE 'Inactive' END FROM users
UNION
SELECT id, 'Unknown' FROM deleted_users;
- Слияние контактных данных:
SELECT phone FROM contacts
UNION
SELECT mobile FROM contacts;
- Объединение времён последнего действия:
SELECT last_login FROM users
UNION
SELECT last_access FROM admins;
- UNION ALL с подсчётом через GROUP BY:
SELECT user_id, COUNT(*) FROM (
SELECT user_id FROM actions_1
UNION ALL
SELECT user_id FROM actions_2
) GROUP BY user_id;
- Объединение значений с NULL:
SELECT NULL AS code FROM dual
UNION
SELECT code FROM lookup_table;
- Слияние системных логов:
SELECT log_text FROM app_logs
UNION
SELECT log_text FROM db_logs;
- UNION с ORDER BY по алиасу:
SELECT name FROM clients
UNION
SELECT name FROM leads
ORDER BY name;
- UNION с преобразованием дат:
SELECT TO_CHAR(date_created, 'YYYY-MM-DD') FROM users
UNION
SELECT TO_CHAR(joined, 'YYYY-MM-DD') FROM members;
- Объединение email и phone в одном поле:
SELECT email AS contact FROM users
UNION
SELECT phone FROM users;
- UNION и аналитические функции:
SELECT id FROM (
SELECT id, RANK() OVER (ORDER BY score DESC) AS rnk FROM scores_q1
)
UNION
SELECT id FROM (
SELECT id, RANK() OVER (ORDER BY score DESC) FROM scores_q2
);
- Сравнение значений после объединения:
SELECT * FROM (
SELECT id, 'Source A' FROM table_a
UNION
SELECT id, 'Source B' FROM table_b
) WHERE id < 1000;
- UNION внутри SELECT:
SELECT (SELECT 'a' FROM dual UNION SELECT 'b' FROM dual) AS val FROM dual;
- Объединение результатов API-логов:
SELECT status_code FROM api_log_prod
UNION
SELECT status_code FROM api_log_stage;
🧩 Заключение
UNION — мощный способ объединять данные из разных источников, при этом автоматически убирая дубликаты.
Если важна производительность и повторы допустимы — используйте UNION ALL.
💡 Советы:
Убедитесь, что столбцы и их типы совпадают
Используйте
ORDER BYтолько в конце объединённого запросаПрименяйте
UNIONдля интеграции и отчётности
🔜 Следующая статья:
INTERSECT в Oracle SQL — как найти пересечение результатов двух запросов