Собесов

Требования для UNION/INTERSECT/EXCEPT

SQLМножественные операцииЛёгкаяJunior

Условие

Какое требование корректно для данных, к которым применяются операции UNION/INTERSECT/EXCEPT?

  • Таблицы должны иметь одинаковые первичные ключи.
  • Количество столбцов должно совпадать, соответствующие столбцы должны иметь совместимые типы данных.
  • Должны совпадать имена столбцов.
  • Длины текстовых значений должны совпадать.

Решение

Правильный ответ — Количество столбцов должно совпадать, соответствующие столбцы должны иметь совместимые типы данных.

Что важно для множественных операций

UNION / INTERSECT / EXCEPT (минус) работают с наборами строк. Поэтому:

  1. Количество столбцов в обоих SELECT-ах одинаковое (иначе СУБД не понимает, как сопоставлять).
  2. Типы данных позиционно совместимы (например, 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

Подводные камни

  1. «Совместимые типы» в разных СУБД. В Oracle/MySQL правила мягче (происходит неявное приведение), в PostgreSQL строже (часто требует явный CAST).
  2. INTERSECT/EXCEPT тоже неявно дедуплицируют. Аналог UNIONINTERSECT ALL / EXCEPT ALL сохраняют дубликаты (с правилами по minimum-counts).
  3. MySQL до 8.0.31 не поддерживал INTERSECT/EXCEPT — эмулировали через EXISTS и LEFT JOIN ... IS NULL.

Эталонный ответ

Количество столбцов должно совпадать, и соответствующие столбцы должны иметь совместимые типы данных. Имена и ключи не важны.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти