Условие
Какое минимальное и максимальное количество записей может выдать FULL JOIN таблицы на 10 строк с таблицей на 100 строк?
Решение
Минимум — 100, максимум — 1000 (в общем случае; при произвольных условиях ON верхняя граница — это декартово произведение 10 × 100 = 1000).
Минимум
FULL OUTER JOIN возвращает:
- Все совпадения по
ON, - Плюс все строки левой без пары справа (с
NULLв правой), - Плюс все строки правой без пары слева (с
NULLв левой).
Минимум достигается, когда каждая из 10 строк левой таблицы матчится с уникальной строкой правой (плюс ещё 90 строк правой остаются без пары). Тогда:
- 10 строк-совпадений + 0 строк левой без пары + 90 строк правой без пары = 100 строк.
Меньше быть не может: 100 строк правой таблицы обязаны попасть в результат хотя бы по разу (с NULL слева, если нет совпадения).
Максимум
Если условие ON соединения такое, что каждая строка левой матчится с каждой строкой правой (например, ON 1 = 1 или ON l.k = r.k где у обеих все ключи одинаковые), это CROSS JOIN:
10 × 100 = 1000строк.
Тут все строки совпали, нечего добирать через outer-эффект.
Промежуточный случай — стандартный «многие ко многим»
Например, у левой 10 ключей, у правой 100 строк, из которых 50 содержат каждый ключ дважды. Тогда совпадения дают 10 * 2 * (50/10) ≈ ... — но в общем виде это просто число пар, удовлетворяющих ON.
Формула:
строк = matches + (10 - left_matched) + (100 - right_matched)
где left_matched — число строк левой, у которых есть хотя бы одна пара; аналогично right_matched.
Подводные камни
- Считать минимум
= max(10, 100) = 100всегда. Это работает, но условие — что 10 строк должны иметь пары; если ключи не пересекаются (left_matched = 0), результат =10 + 100 = 110. То есть «100» — это нижняя граница при удачных ключах. - Считать максимум
= 110. Это распространённый ответ, но он верен только для join-а 1:1 (или когда совпадений нет — тогда ровно10 + 100). При условииON 1=1или дубликатах ключей результат раздувается до10 × 100. - Путать с
INNER JOIN. УINNERминимум —0(нет пересечений), максимум —1000. Без outer-эффекта.
Эталонный ответ
Минимум — 100 (когда все 10 строк левой имеют хотя бы одну пару). Максимум — 1000 (декартово произведение).
Если уточнить «при попарном сопоставлении 1:1»: минимум 100, максимум 110.