Вопрос проверяет понимание семантики LEFT JOIN и типичной ошибки при фильтрации данных.
Если условие перенести из ON в WHERE, результат меняется.
Строки без совпадений отбрасываются.LEFT JOIN фактически превращается в INNER JOIN.
Это одна из самых частых ошибок в SQL.
Поведение запроса кардинально меняется.
Разницу проще всего понять на логическом примере.
ONSELECT o.id, p.id
FROM orders o
LEFT JOIN payments p
ON o.id = p.order_id AND p.status = 'SUCCESS';
Результат:
Все строки из orders сохраняются.
Если платежа нет или статус другой — p.* = NULL.
WHERESELECT o.id, p.id
FROM orders o
LEFT JOIN payments p
ON o.id = p.order_id
WHERE p.status = 'SUCCESS';
Результат:
Строки с NULL в p.status отбрасываются.
Остаются только строки с совпавшими платежами.
Поведение эквивалентно INNER JOIN.
Важно понимать:
WHERE применяется после JOIN.
Условие p.status = 'SUCCESS' ложно для NULL.
Такие строки удаляются из результата.
Перенос условия из ON в WHERE при LEFT JOIN отбрасывает строки без совпадений и превращает запрос в INNER JOIN.