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

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

Разбор

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

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

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