Для одного order_id в order_items есть 3 строки, а в payments — 2 строки. Вы соединили обе таблицы по order_id без предварительной агрегации. Сколько строк получится для этого заказа и почему?

A5 строк, потому что просто складываются 3 позиции и 2 платежа в общий список без какого-либо умножения комбинаций.
B3 строки, потому что соединение по ключу заказа всегда даёт связь «один к многим» и сохраняет именно число позиций.
C2 строки, потому что записи о платежах «поглощают» позиции при соединении и в результате остаётся только число платежей.
D6 строк, потому что внутри одного order_id возникает связь «многие ко многим» и происходит размножение строк: 3 × 2 = 6.
Правильный ответ. Когда две таблицы обе one-to-many к одному ключу, их JOIN превращается в many-to-many и даёт join explosion.

Разбор

Внутри одного order_id позиции и платежи комбинируются между собой. Каждая из 3 позиций соединится с каждым из 2 платежей, поэтому получится 6 строк. Это типичный источник дублирования в денежных метриках, если затем делать SUM() по такому соединению. Чтобы избежать размножения строк, обычно агрегируют одну из сторон до соединения.

Проверь себя · 1/3разбор после ответа
Вы соединяете таблицы пользователей и заказов по user_id, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?
Открыть Карьерник в Telegram

Ещё вопросы по теме «JOIN и кардинальность»