В каком случае SUM(order_amount) после JOIN скорее всего останется корректным, без эффекта размножения строк?
AСоединение
orders с order_items по order_id: связь один-ко-многим размножает строки заказовBСоединение
orders с payments по user_id: ключ соединения шире, чем order_id, и может дублировать платежиCСоединение
orders с users по user_id при одной строке на пользователя справа: атрибутный JOIN без размноженияDСоединение
orders с product_tags по product_id: связь многие-ко-многим через теги создаёт дубликатыПравильный ответ. Атрибутный
JOIN к таблице с одной строкой на ключ не размножает строки, поэтому SUM() по сумме заказа не искажается.Разбор
Если правая таблица имеет максимум одну строку на ключ, каждая строка заказов найдёт не более одного совпадения. В таком случае SUM(order_amount) останется на том же уровне, просто к строкам добавятся атрибуты. А вот JOIN к источнику с отношением «один-ко-многим» или «многие-ко-многим» часто создаёт дубликаты строк и завышает суммы. Поэтому перед агрегацией важно проверять связность ключа справа.
Проверь себя · 1/3разбор после ответа
После
JOIN таблиц users и events по user_id (связь один-ко-многим) вы хотите получить число пользователей, у которых был хотя бы один ивент. Какой расчёт даст корректное число?Ещё вопросы по теме «JOIN и кардинальность»
- В таблице `users` 100 000 строк, в таблице `user_profiles` — ровно одна строка на каждого `user_id`. Вы делаете `INNER JOIN` по `user_id`. Что верно про число строк результата?
- Вы соединяете таблицы пользователей и заказов по `user_id`, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?
- Для одного `order_id` в `order_items` есть 3 строки, а в `payments` — 2 строки. Вы соединили обе таблицы по `order_id` без предварительной агрегации. Сколько строк получится для этого заказа и почему?
- Нужен набор данных на уровне `user_id`: выручка из `orders` и число сессий из `sessions`. В обеих таблицах по пользователю много строк (один-ко-многим). Какой подход минимизирует риск размножения строк в соединении?
- Вы хотели посчитать средний чек по заказам как `AVG(order_total)`. Но перед этим соединили `orders` с `order_items` по `order_id` (связь один-ко-многим). Почему `AVG()` может измениться по сравнению с расчётом на таблице `orders`?
- Все вопросы по «JOIN и кардинальность» →