Learnly
SQL для аналитиков/Глава 7/Урок 3

Типичные ошибки при JOIN

Типичные ошибки при 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, 1:N, N:M)?
  2. Нужны ли строки без пары? → LEFT JOIN
  3. Может ли ключ быть NULL?
  4. Не умножаются ли строки?

💡 Главная мысль: JOIN, мощный инструмент и источник ошибок. Всегда проверяй количество строк до и после. Умножение строк, самая частая и коварная ошибка.