Раздел 10 · Databases

Дубликаты при джойнах

junior~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Самая дорогая ошибка в SQL не та, что падает, а та, что тихо возвращает неверное число. Классический пример: отчёт, где после добавления ещё одного JOIN выручка вдруг выросла вдвое. На собеседовании это спрашивают, чтобы проверить, думаешь ли ты о том, сколько строк даёт соединение. В прошлом уроке мы искали строки без пары, а теперь разберёмся со строками, у которых пар слишком много. Данные из учебной базы блока.

Как спрашивают

После того как в отчёт по клиентам добавили таблицу оплат, сумма заказов выросла. Почему, и как это починить?

Часто проще: «Почему count(*) после JOIN больше, чем клиентов в таблице?»

Короткий ответ

Соединение «один ко многим» повторяет строку «одного» столько раз, сколько у неё пар. Если затем посчитать или сложить колонку «одного», каждое значение войдёт в результат несколько раз. Хуже всего, когда к одной строке присоединяют две разные таблицы «многих»: строк становится произведение, и обе суммы раздуваются. Лечение: сначала агрегировать каждую таблицу «многих» отдельно до одной строки на ключ, а потом соединять. DISTINCT здесь обычно не лекарство.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.