Типичные ошибки при JOIN
JOIN, источник множества ошибок даже у опытных аналитиков. Разберём самые частые.
Ошибка 1: Умножение строк
Если в правой таблице несколько строк для одной строки из левой, результат "раздувается":
-- orders: 1 строка на заказ
-- order_items: несколько строк на заказ
SELECT o.id, o.amount, oi.product_name
FROM orders o
JOIN order_items oi ON oi.order_id = o.id;
Если у заказа 3 позиции, он появится в результате 3 раза. amount тоже повторится 3 раза. Если потом сделать SUM(amount), получишь завышенную сумму.
Решение: Понимать структуру данных перед JOIN. Проверять количество строк до и после.
Ошибка 2: NULL в ключе
-- Если customer_id может быть NULL
SELECT * FROM orders o
JOIN customers c ON o.customer_id = c.id;
Заказы с customer_id = NULL потеряются, NULL не равно ни одному id. Используй LEFT JOIN если нужно сохранить такие заказы.
Ошибка 3: Неправильный тип JOIN
-- Хочешь всех клиентов с количеством заказов
-- INNER JOIN потеряет клиентов без заказов
SELECT c.name, COUNT(o.id)
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id -- неправильно
GROUP BY c.id;
-- LEFT JOIN сохранит всех
SELECT c.name, COUNT(o.id)
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id -- правильно
GROUP BY c.id;
Ошибка 4: Фильтр LEFT JOIN в WHERE
-- Хотел LEFT JOIN но фактически получил INNER JOIN
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'completed'; -- фильтрует NULL, теряем клиентов без заказов!
-- Правильно, условие в ON
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id AND o.status = 'completed';
Чеклист перед использованием JOIN
- Знаешь ли связь между таблицами (1:1, 1:N, N:M)?
- Нужны ли строки без пары? → LEFT JOIN
- Может ли ключ быть NULL?
- Не умножаются ли строки?
💡 Главная мысль: JOIN, мощный инструмент и источник ошибок. Всегда проверяй количество строк до и после. Умножение строк, самая частая и коварная ошибка.