Ответ
В PostgreSQL UNION — это оператор для объединения результирующих наборов двух или более SELECT-запросов в один общий набор. Он автоматически удаляет дублирующиеся строки из финального результата.
Синтаксис и ключевые правила:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
- Количество и порядок столбцов во всех объединяемых
SELECTдолжны совпадать. - Типы данных соответствующих столбцов должны быть совместимыми (PostgreSQL попытается выполнить неявное приведение типов, если это возможно).
- Удаление дубликатов:
UNIONвыполняет сортировку и удаление дублей, что может быть ресурсоемкой операцией на больших наборах данных.
Оператор UNION ALL:
Для объединения результатов без удаления дубликатов и, как следствие, быстрее, используется UNION ALL.
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
Практические примеры:
Пример 1: Сбор данных из разных таблиц с одинаковой структурой.
-- Получить уникальные имена всех сотрудников и подрядчиков
SELECT first_name FROM employees
UNION
SELECT contractor_name FROM contractors
ORDER BY first_name; -- ORDER BY применяется ко всему итоговому набору
Пример 2: Разделение логики с UNION ALL для производительности.
-- Получить все записи активности за последний день из двух логов,
-- где дубли маловероятны и не критичны.
SELECT user_id, action, created_at FROM ui_logs WHERE created_at >= NOW() - INTERVAL '1 day'
UNION ALL
SELECT user_id, action, created_at FROM api_logs WHERE created_at >= NOW() - INTERVAL '1 day';
Пример 3: Создание "виртуального" набора данных для тестирования или вычислений.
-- Использование UNION с литералами для создания временного набора
SELECT 1 AS id, 'Active' AS status
UNION ALL
SELECT 2, 'Inactive'
UNION ALL
SELECT 3, 'Pending';
Важное замечание: UNION часто используется для запросов к таблицам с разделенной (partitioned) или шардированной структурой, где логически связанные данные физически хранятся в разных таблицах.