Условие
Какое требование корректно для данных, к которым применяются операции UNION/INTERSECT/EXCEPT?
- Таблицы должны иметь одинаковые первичные ключи.
- Количество столбцов должно совпадать, соответствующие столбцы должны иметь совместимые типы данных.
- Должны совпадать имена столбцов.
- Длины текстовых значений должны совпадать.
Решение
Правильный ответ — Количество столбцов должно совпадать, соответствующие столбцы должны иметь совместимые типы данных.
Что важно для множественных операций
UNION / INTERSECT / EXCEPT (минус) работают с наборами строк. Поэтому:
- Количество столбцов в обоих
SELECT-ах одинаковое (иначе СУБД не понимает, как сопоставлять). - Типы данных позиционно совместимы (например,
INTиBIGINT— окей;INTиTEXT— нет).
Имена столбцов брать из первого SELECT-а — они не обязаны совпадать с именами во втором.
Разбор вариантов
- «Одинаковые первичные ключи» — нет, это не требование. Множественные операции работают с любыми результатами выборок (даже без таблиц вообще).
- «Совпадение имён столбцов» — нет. PostgreSQL и большинство СУБД берут имена из первого
SELECT. Если имена не совпадают — операция работает. - «Длины текстовых значений совпадают» — нет, это вообще не про операции, а про столбцы.
VARCHAR(10)иTEXT— совместимы дляUNION.
Корректный пример
SELECT id, name FROM employees
UNION
SELECT user_id, full_name FROM customers;
-- Колонки результата: id, name (имена из первого)
-- Типы: id → INT, name → TEXT (если совместимы)Некорректные
-- Разное количество столбцов:
SELECT id, name FROM employees
UNION
SELECT id FROM customers; -- ОШИБКА
-- Несовместимые типы (PostgreSQL строгий):
SELECT id FROM employees
UNION
SELECT name FROM customers; -- ОШИБКА: int vs textПодводные камни
- «Совместимые типы» в разных СУБД. В Oracle/MySQL правила мягче (происходит неявное приведение), в PostgreSQL строже (часто требует явный
CAST). INTERSECT/EXCEPTтоже неявно дедуплицируют. АналогUNION—INTERSECT ALL/EXCEPT ALLсохраняют дубликаты (с правилами по minimum-counts).MySQL до 8.0.31не поддерживалINTERSECT/EXCEPT— эмулировали черезEXISTSиLEFT JOIN ... IS NULL.
Эталонный ответ
Количество столбцов должно совпадать, и соответствующие столбцы должны иметь совместимые типы данных. Имена и ключи не важны.