У пользователя может быть несколько заказов в orders и несколько возвратов в refunds. Вы соединили orders и refunds по user_id и посчитали SUM(refund_amount). Что наиболее вероятно произойдёт с суммой и почему?

AСумма не изменится, потому что SUM() устойчив к duplication
BСумма станет меньше, потому что INNER JOIN удалит часть возвратов
CСумма станет равна числу пользователей, потому что COUNT(*) и SUM() эквивалентны
DСумма завысится: получится many-to-many по user_id, возникнет join explosion, и каждый возврат повторится для каждого заказа
Правильный ответ. Когда обе стороны имеют несколько строк на user_id, JOIN становится many-to-many и раздувает SUM() из-за duplication.

Разбор

Внутри пользователя заказы и возвраты комбинируются, образуя пары «каждый с каждым». В результате один и тот же возврат попадает в несколько строк и учитывается несколько раз в SUM(refund_amount). Чтобы исправить, нужно pre-aggregate одну из сторон до user_id или соединять по более точному ключу, например order_id.

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

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