Собесов

Минимум и максимум строк в FULL JOIN таблиц 10 × 100

SQLJOIN-ыСредняяJunior

Условие

Какое минимальное и максимальное количество записей может выдать 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.

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

  1. Считать минимум = max(10, 100) = 100 всегда. Это работает, но условие — что 10 строк должны иметь пары; если ключи не пересекаются (left_matched = 0), результат = 10 + 100 = 110. То есть «100» — это нижняя граница при удачных ключах.
  2. Считать максимум = 110. Это распространённый ответ, но он верен только для join-а 1:1 (или когда совпадений нет — тогда ровно 10 + 100). При условии ON 1=1 или дубликатах ключей результат раздувается до 10 × 100.
  3. Путать с INNER JOIN. У INNER минимум — 0 (нет пересечений), максимум — 1000. Без outer-эффекта.

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

Минимум — 100 (когда все 10 строк левой имеют хотя бы одну пару). Максимум — 1000 (декартово произведение).

Если уточнить «при попарном сопоставлении 1:1»: минимум 100, максимум 110.

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

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

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