В таблице payments(order_id, amount, status) для одного order_id может быть несколько попыток оплаты (один-ко-многим), например повторные списания или ошибки. Вы хотите посчитать выручку по заказам из orders. Что наиболее безопасно сделать перед соединением, чтобы SUM() не завысилась из-за дублирования?

AСоединить таблицы как есть и затем применить DISTINCT ко всем строкам результата, чтобы убрать повторяющиеся записи
BСначала свернуть payments до одной строки на order_id (предварительная агрегация), затем соединить с orders через JOIN
CСоединить payments с orders по полю user_id, поскольку так совпадений будет больше и выручка не потеряется
DЗаменить SUM() на COUNT(*), так как количество строк всегда даёт более устойчивую оценку выручки по заказам
Правильный ответ. При связи один-ко-многим по order_id деньги нужно сводить до одного факта на заказ через предварительную агрегацию, иначе появится дублирование в SUM().

Разбор

Если у заказа несколько платёжных строк, то orders начнёт дублироваться при JOIN, и каждая попытка попадёт в расчёт. В зависимости от бизнес-логики нужно выбрать правило: только успешные платежи, последний успешный или сумма успешных. После предварительной агрегации соединение становится ближе к один-к-одному, и денежные метрики становятся интерпретируемыми.

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

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