Ко всем статьям

SQL JOIN: почему после соединения таблиц растёт число строк

SQL JOIN: почему после соединения таблиц растёт число строк
Короткий ответ

JOIN возвращает пары строк, удовлетворяющие условию соединения. Если одному ключу слева соответствуют несколько строк справа, исходная запись повторяется в результате. Прежде чем суммировать выручку, нужно определить уровень детализации каждой таблицы и ожидаемую связь: один к одному, один ко многим или многие ко многим.

Для кого и когда полезен этот разбор

Начинающему аналитику данных, программисту и системному аналитику, который работает с табличными данными и хочет понимать причины ошибок.

Задача материала - sql join. Здесь есть порядок действий, условный пример и критерии проверки. Используйте их как основу для учебной работы или обсуждения процесса с ответственным специалистом.

Порядок работы и контроль

ЭтапЧто сделатьУчебная ситуацияКак проверить
Уровень строкиОпишите смысл записи каждой таблицыЗаказ и отдельный платёжПисьменное определение детализации
КлючПроверьте уникальность ключа на каждой сторонеorder_id повторяется в paymentsЗапрос GROUP BY с COUNT
СвязьПредскажите число совпадений до выполнения JOINОдин заказ и два платежаОжидаемые две пары строк
АгрегацияПриведите платежи к нужному уровню отчётаSUM(amount) по order_idОдна строка на заказ в подзапросе
Контроль суммыСравните суммы до и после соединенияВыручка заказа остаётся 10 000Отдельная сверка каждого показателя

Пример с разбором

Учебный пример: таблица orders содержит один заказ №7 на 10 000 рублей. В payments для него две строки: 4 000 и 6 000. После соединения по order_id получится две строки, и SUM(orders.amount) даст ошибочные 20 000. Сумма платежей 10 000 при этом корректна. Для отчёта «одна строка на заказ» сначала агрегируйте payments по order_id, затем соединяйте итог с orders. DISTINCT по всему результату не исправляет различающиеся строки платежей.

Как адаптировать решение

Для LEFT JOIN отдельно проверьте заказы без платежей. Они должны сохраняться, если отчёт охватывает все заказы. Фильтр по полю правой таблицы в WHERE может удалить строки с отсутствующим совпадением: условия отбора платежей часто нужно учитывать до агрегации или в ON. Минимальный тестовый набор включает заказ без оплаты, с одной оплатой и с двумя. Если любой из этих случаев отсутствует, красивый итог на обычных данных ещё не доказывает корректность запроса.

Учебное задание

Добавьте к заказу №7 три товарные позиции и соедините orders одновременно с payments и order_items без предварительной агрегации. Две оплаты и три позиции дадут шесть сочетаний для одного заказа. Затем отдельно агрегируйте обе дочерние таблицы до order_id и повторите соединение. Проверьте число строк, сумму заказа, сумму оплат и количество позиций. Это упражнение выявляет ошибку связи многие ко многим даже тогда, когда один простой JOIN выглядел корректно.

Создайте маленький учебный набор с заранее известным ответом. Обычный случай, отсутствие данных, повтор, неверное значение и пограничное состояние должны быть представлены отдельно. До выполнения запроса запишите ожидаемый результат; после выполнения сравните число строк, ключи и показатели. Используйте тестовую базу и разрешённые данные. Скриншот успешного запроса без входных записей не позволяет проверить правильность решения.

Как оформить учебный результат

Сохраните входные данные, выбранное правило, полученный результат и подтверждение проверки. У каждого изменения укажите причину. Отдельно запишите, чего пример не проверяет: другой объём данных, дополнительные условия или особые требования организации. Этот список помогает избежать переноса учебного результата на ситуацию, для которой он ещё не испытан.

Хотите научиться работать с данными и SQL?

Позвоните бесплатно в Grand School по вопросам обучения и входа в профессию:

8 800 100-78-61
Обучение по вашей задаче: Аналитик данных

Сравните этот разбор с вашей профессиональной целью. В карточке программы Grand School можно уточнить условия обучения и поступления.

Выбрать программу и записаться

Ошибки, которые меняют результат

  • Лечить любое размножение DISTINCT: можно удалить правильные повторные операции
  • Соединять по имени клиента: одинаковые имена не гарантируют одну сущность
  • Суммировать меру верхнего уровня после JOIN с деталями: показатель дублируется по каждой детали

Как передать результат в работу

Сохраните схему таблиц, тестовые данные, запрос и таблицу «ожидание - факт». Отдельно укажите СУБД, её версию и значимые настройки клиента. Не переносите поведение одной базы на другую без проверки. Перед передачей запроса коллегам объясните уровень детализации результата и ограничения. В рабочей среде изменения данных и схемы выполняются по согласованному процессу; учебный пример не является готовой производственной миграцией.

Поле рабочей записиЧто сохранить
Объект и датаУникальный объект, период или версия, к которым относится результат.
ОснованиеИсточник данных, запрос или согласованное условие.
ПроверкаОжидаемый результат и фактическое подтверждение.
ОграничениеЧто неизвестно, не испытано или требует отдельного решения.
Следующий шагДействие, ответственный и срок повторной проверки.

Перед первой передачей проверьте результат с человеком, который не участвовал в подготовке. Он должен найти нужный объект, понять правило и повторить контроль. Если для этого нужны устные пояснения, добавьте недостающий контекст в рабочую запись. Согласуйте, где хранится основной экземпляр и кто вправе его менять: несколько расходящихся копий быстро делают проверку бесполезной.

Контроль перед использованием

Уровень строки определён; ключи и связи проверены; отсутствующие и повторные записи испытаны; ожидаемые суммы рассчитаны вручную; запрос сохраняет нужные объекты; версия СУБД и ограничения указаны.

Где учиться и как выбрать программу

Для обучения этому направлению полезны основы SQL, логическая модель данных и навыки тестирования результата. Практическое портфолио может состоять из небольшой схемы, нескольких запросов и описания обнаруженной ошибки. Важно уметь объяснить, почему результат корректен, а не только написать работающий синтаксис. При выборе программы сообщите специалисту, нужна ли вам аналитика, разработка или сопровождение систем: похожие названия курсов могут вести к разным задачам.

Выбирайте программу по задачам, которые хотите выполнять, и исходному образованию. Для новой профессиональной области рассматривают переподготовку; для углубления уже имеющихся компетенций сравнивают подходящие программы повышения квалификации. Название курса само по себе не подтверждает наличие конкретного программного продукта или практики: уточните актуальный учебный план, условия обучения и итоговую аттестацию перед записью.

Аналитик данных

Программа Grand School в направлении «Информационные технологии». Откройте карточку, сравните условия с вашей профессиональной целью и уточните, как изучаемая задача представлена в актуальном плане.

Посмотреть программу и записаться
Специалист по управлению данными и информационными объектами

Программа Grand School в направлении «Информационные технологии». Откройте карточку, сравните условия с вашей профессиональной целью и уточните, как изучаемая задача представлена в актуальном плане.

Посмотреть программу и записаться

Перед звонком запишите три вопроса: какие входные требования действуют для выбранной программы; какие учебные задания помогут освоить нужную работу; какой документ и при каких условиях выдаётся после завершения. Расскажите об опыте и примере задачи из статьи. Не выбирайте курс только по длительности: важны соответствие цели, содержание и понятный способ проверки освоенных навыков.

Итоговая программа может отличаться в зависимости от индивидуальных запросов ученика. Содержание, формат, стоимость и условия поступления уточняйте для выбранной программы. Документ об обучении не заменяет предусмотренные законом требования к должности, полномочиям или допуску.

Хотите научиться работать с данными и SQL?

Расскажите о своём образовании, опыте и рабочих задачах. Специалист Grand School поможет сравнить программы и уточнить условия поступления. Бесплатный звонок по России:

8 800 100-78-61

Позвонить бесплатно

Частые вопросы

Почему LEFT JOIN тоже увеличивает строки?

Он сохраняет строки левой стороны, но не ограничивает число совпадений справа одним. Если совпадений два, левая строка участвует в двух результатах. Тип соединения и кратность связи - разные вопросы.

Поможет ли COUNT(DISTINCT order_id)?

Он может корректно посчитать уникальные заказы, но не исправляет сумму выручки, уже повторённую по деталям. Каждый показатель проверяют на своём уровне, а не лечат весь отчёт одним выражением.

Нужно ли всегда агрегировать заранее?

Нет. Для отчёта по отдельным платежам детализация нужна. Предварительная агрегация требуется, когда результат должен иметь более крупный уровень и дочерние строки иначе искажают меру.

Источники и границы применения

Семантика соединения таблиц сверена с документацией PostgreSQL. Учебные данные о заказах и платежах созданы для объяснения кратности связи.

Проверено 5 октября 2026 года. Ссылка на первичный источник:

PostgreSQL: Joins Between Tables

Обзор направления поможет сопоставить эту задачу с другими профессиональными обязанностями и вариантами обучения:

Профессия и обучение: Информационные технологии

Для следующего практического шага сохраните результат учебного задания и список вопросов, которые остались после проверки. Их можно обсудить с руководителем процесса или со специалистом при подборе обучения.