Условие
Какое условие соединения в 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 > NULL—NULL(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, чтобы дизъюнкция была истинной.
Подводные камни
- Думать, что
ON 1 = 0= декартово. Наоборот: пустое внутреннее соединение,FULLдобавит обе таблицы как непарные. - Сравнение с
NULL. Любоеx = NULL/x > NULL/x < NULLдаётNULL, а неTRUE/FALSE. ВWHERE/ONэто эквивалентноFALSE. - Если нужен явно декартов сценарий — пишите
CROSS JOIN. Это семантически чище, чемFULL JOIN ON TRUE.
Эталонный ответ
D) ON TRUE OR NULL. Условие всегда истинно → FULL JOIN сматчит каждую строку с каждой = декартово произведение.