Почему после JOIN появляются дубли строк
Почему после JOIN появляются дубли строк
❓ Часто замечаю, что многие, кто начинает свой путь в анал итике , не до конца понимают, как реально работают JOIN’ы в SQL.
Может ошибочно казаться, что условный LEFT JOIN только подтягивает поля из второй таблицы, соответственно кол-во строк остается таким же. (как ВПР в excеl'e)
Или INNER JOIN оставляет только строки из левой и правой таблиц, то есть количество строк останется таким же или становится меньше.
Но на самом деле джойны строят все совпадения строк по условию соединения . Именно поэтому количество строк после них может не только уменьшиться или остаться тем же, но и вырасти . Разберем на примере: tbl1 id - 10 строк
12344556 NULL
NULL tbl2 id - 7 строк
134456 NULL
Выполняем:
SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id
= t2.id
Что получится:
➖ 1 → 1 совпадение
➖ 2 → нет совпадений, но в LEFT JOIN строка останется, а справа будут NULL
➖ 3 → 1 совпадение
➖ 4 → слева 2 строки, справа 2 строки → будет
4 строки
➖ 5 → слева 2 строки, справа 1 строка → будет
2 строки
➖ 6 → 1 совпадение
➖ NULL с NULL через = не матчится, поэтому обе строки с NULL слева просто останутся без пары (заполнятся NULL'ами справа)
Итого: 12 строк
Почему так?
👉 каждая строка слева соединяется со всеми подходящими строками справа
То есть если ключ не уникален, строки начинают размножаться.
Например:
➖ 2 строки слева × 2 строки справа = 4 строки
➖ 2 строки слева × 3 строки справа = 6 строк
Именно поэтому я и говорю, что после JOIN количество строк может увеличиться.
И это касается не только LEFT JOIN.
➖ В INNER JOIN строк тоже может стать больше, если есть множественные совпадения с обеих сторон
➖ В RIGHT JOIN — та же логика, просто сохраняется уже правая таблица
➖ В FULL JOIN — тоже могут появляться дополнительные строки за счет множественных совпадений и несовпавших записей с обеих сторон
➖ В CROSS JOIN вообще сразу строится декартово произведение, поэтому там рост количества строк очевиден изначально
Еще раз закрепим: ключевая идея JOIN'ов не просто "подтянуть поля", а построить все пары строк, которые подходят под условие соединения
Еще одна задача на закрепление понимания
Если в левой таблице 100 строк и в правой таблице 100 строк, то сколько строк может быть после JOIN в минимальном и максимальном случае? (разберем на примере INNER'а и LEFT'а)
Попробуйте сначала ответить сами и написать в комментах
👇 Ответ:
➖ для INNER JOIN минимум — 0, максимум — 10 000
➖ для LEFT JOIN минимум — 100, максимум — 10 000
Разберем, почему так
Минимум:
➖ INNER JOIN может дать 0 строк, если совпадений между таблицами нет вообще.
➖ LEFT JOIN меньше 100 строк здесь дать не может, потому что он в любом случае сохраняет все строки из левой таблицы. Если совпадений справа нет — просто получим NULL в колонках правой таблицы.
Максимум:
➖ В предельном случае каждая строка слева может соединиться с каждой строкой справа (в обоих случаях).
Тогда получаем:
100 × 100 = 10 000 строк
Именно поэтому при работе с JOIN'ами важно не просто смотреть на условие соединения, но и всегда держать в голове гранулярность таблиц и возможную неуникальность ключей.
❤️🔥 Подписывайтесь и поддержите канал бустом
↗️ Менторю и помогаю выйти на оффер
❓ У кого после JOINа хоть раз ехали метрики из-за того, что выросло количество строк?
👇 @data_driven_bogdan
Откликнуться в Telegram →
⚠️ Никогда не платите «за оформление» или «гарантию трудоустройства» — это признак мошенников. Работа ТРУ не несёт ответственности за содержание вакансии.