Собесов

Какое условие FULL JOIN даёт декартово произведение?

SQLJOIN-ыЛёгкаяJunior

Условие

Какое условие соединения в FULL JOIN приведёт к формированию всех возможных комбинаций строк из двух таблиц?

  • A) ON 1 = 0
  • B) ON 1 < 0
  • C) ON 1 > NULL
  • D) ON TRUE OR NULL

Решение

Правильный ответ: D.

Декартово произведение получается, когда условие ON истинно для каждой пары строк. Тогда INNER-часть join-а сматчит каждую с каждой (это n × m строк), и FULL-добавки уже нечего делать.

Разберём варианты:

  • A 1 = 0 — всегда FALSE. Нет совпадений → FULL JOIN отдаёт n + m строк (все слева с NULL справа + все справа с NULL слева). Это не декартово произведение.
  • B 1 < 0 — тоже FALSE. То же самое, что и A.
  • C 1 > NULLNULL (UNKNOWN). В фильтрах UNKNOWN отбрасывается → ведёт себя как FALSE. Снова n + m строк.
  • D TRUE OR NULL — благодаря короткому замыканию OR это TRUE. Условие истинно для всех пар → n × m декартовых строк.

Логика трёхзначной логики

A B A OR B
TRUE NULL TRUE
FALSE NULL NULL
NULL NULL NULL

TRUE OR NULL = TRUE, потому что хватает одного TRUE, чтобы дизъюнкция была истинной.

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

  1. Думать, что ON 1 = 0 = декартово. Наоборот: пустое внутреннее соединение, FULL добавит обе таблицы как непарные.
  2. Сравнение с NULL. Любое x = NULL / x > NULL / x < NULL даёт NULL, а не TRUE/FALSE. В WHERE/ON это эквивалентно FALSE.
  3. Если нужен явно декартов сценарий — пишите CROSS JOIN. Это семантически чище, чем FULL JOIN ON TRUE.

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

D) ON TRUE OR NULL. Условие всегда истинно → FULL JOIN сматчит каждую строку с каждой = декартово произведение.

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

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

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