Условие
Есть две таблицы, связанные по полю user_id. Одному пользователю в каждой таблице соответствует одна строка (1:1).
В первой таблице 60 строк, во второй — 70.
Сколько максимально строк может быть в результирующей таблице, если выполняем INNER JOIN?
- 60
- 70
- 130
- 4200
Решение
Правильный ответ — 60.
Логика
INNER JOIN оставляет только строки, у которых есть совпадение по ключу в обеих таблицах. Это пересечение по user_id.
При отношении 1:1 (один пользователь → одна строка в каждой таблице):
- Каждое совпадение даёт ровно 1 строку результата.
- Число совпадений ≤
min(|T1|, |T2|) = min(60, 70) = 60.
То есть максимум — 60 строк (когда все 60 пользователей из первой таблицы есть и во второй).
Почему не другие варианты
- 70 — это количество, которое могло бы быть, если бы все 70 пользователей второй таблицы были в первой. Но в первой только 60 — невозможно.
- 130 = 60 + 70 — это размер
FULL OUTER JOINпри отсутствии совпадений (илиUNION ALL). - 4200 = 60 × 70 — декартово произведение
CROSS JOIN. Получится, если связь была бы M:M или условие тривиально-истинное.
Формальная формула
Для join-а 1:1:
|A INNER JOIN B ON a.k = b.k| = |A ∩ B по ключу| ≤ min(|A|, |B|)
Для общего случая (когда у одного пользователя могут быть несколько строк):
≤ |A| × |B| (граница декартова произведения)
Подводные камни
INNER JOINне «складывает» таблицы. Это пересечение, не объединение. Объединение —UNION(с дедупликацией) илиUNION ALL.- Связь 1:N меняет картину. Если у каждого пользователя в таблице B по 5 заказов, то 60 пользователей × 5 = 300 строк максимум.
- Несовпадения теряются молча. В 1:1 при 50 совпадениях из 60 — 50 строк результата, остальные 10 «исчезают». Чтобы их видеть — нужен
LEFT JOIN.
Эталонный ответ
60. При связи 1:1 максимум строк в INNER JOIN равен min(|T1|, |T2|).