Вы хотите добавить к orders атрибут category из таблицы products(product_id, category) и не изменить количество строк заказов. Что важнее всего проверить про products, чтобы избежать дублирования?
AОтсутствие повторов
order_id в заказах: кардинальность ключа JOIN в справочнике перед соединением можно не проверятьBУникальность
product_id в справочнике: один к одному по ключу JOIN, и атрибутное соединение не создаёт дубликатовCЗаполненность поля
category на 100% во всех строках: при полном справочнике атрибутный JOIN не добавляет лишних строкDИспользование
DISTINCT после JOIN: повторы в справочнике не влияют на итоговое число строк заказовПравильный ответ. Если справочник один к одному по ключу
JOIN, атрибутный JOIN не вызывает дублирования строк.Разбор
Проблемы начинаются, когда в справочнике на один product_id несколько строк — например, разные версии атрибутов. Тогда один заказ начинает соответствовать нескольким строкам и появляется дублирование. Проверка уникальности ключа — простой способ предсказать изменение числа строк ещё до расчёта метрик. Уникальность order_id в orders тут не поможет, заполненность category не имеет отношения к числу строк, а DISTINCT после JOIN маскирует дубли и легко искажает агрегаты.
Проверь себя · 1/3разбор после ответа
Вы соединяете таблицы пользователей и заказов по
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 и кардинальность» →