Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: left, join, filter

Как меняется результат LEFT JOIN, если условие фильтрации перенести из ON в WHERE?

Вопрос проверяет понимание семантики LEFT JOIN и типичной ошибки при фильтрации данных.

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

Если условие перенести из ON в WHERE, результат меняется.
Строки без совпадений отбрасываются.
LEFT JOIN фактически превращается в INNER JOIN.
Это одна из самых частых ошибок в SQL.
Поведение запроса кардинально меняется.

Длинный ответ

Разницу проще всего понять на логическом примере.

Условие в ON

SELECT o.id, p.id
FROM orders o
LEFT JOIN payments p
    ON o.id = p.order_id AND p.status = 'SUCCESS';

Результат:

  1. Все строки из orders сохраняются.

  2. Если платежа нет или статус другой — p.* = NULL.

Условие в WHERE

SELECT o.id, p.id
FROM orders o
LEFT JOIN payments p
    ON o.id = p.order_id
WHERE p.status = 'SUCCESS';

Результат:

  1. Строки с NULL в p.status отбрасываются.

  2. Остаются только строки с совпавшими платежами.

  3. Поведение эквивалентно INNER JOIN.

Почему так происходит

Важно понимать:

  1. WHERE применяется после JOIN.

  2. Условие p.status = 'SUCCESS' ложно для NULL.

  3. Такие строки удаляются из результата.

Краткий вывод

Перенос условия из ON в WHERE при LEFT JOIN отбрасывает строки без совпадений и превращает запрос в INNER JOIN.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

Ключевые слова

#left

#join

#filter

Подпишись на Java Developer в телеграм