Представлены таблицы A и B:

Результаты отличаются: условие в ON сохраняет все строки A, подставляя NULL для отсутствующего совпадения B; условие в WHERE отбрасывает эти строки и оставляет только id = 1.

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

Что ответить на собеседовании

Результаты отличаются: условие в ON сохраняет все строки A, подставляя NULL для отсутствующего совпадения B; условие в WHERE отбрасывает эти строки и оставляет только id = 1.

Подробный разбор

Ответ с пояснениями

Условие

Представлены таблицы A и B:

select * from A +----+-----+ |id |val | +----+-----+ |1 |A | |2 |B | |3 |C | +----+-----+

select * from B +----+-----+ |id |val | +----+-----+ |1 |A | |2 |B | |3 |C | |4 |A | +----+-----+

Будут ли отличаться результаты, возвращаемые следующими запросами?

1 select * from A left join B on A.id = B.id and B.val = 'A'

2 select * from A left join B on A.id = B.id where B.val = 'A'

Ответ

Результаты отличаются: условие в ON сохраняет все строки A, подставляя NULL для отсутствующего совпадения B; условие в WHERE отбрасывает эти строки и оставляет только id = 1.

Первый запрос возвращает три строки: (1, A, 1, A), (2, B, NULL, NULL), (3, C, NULL, NULL). У B с id 2 и 3 значение не A, поэтому они не подходят под условие соединения.

Второй запрос сначала связывает строки по id, затем WHERE B.val = 'A' удаляет результаты с B и C. Остаётся (1, A, 1, A). Строка B с id 4 не появляется ни в одном запросе: LEFT JOIN сохраняет левую таблицу, а не правую. Порядок строк без ORDER BY не гарантирован.

Источник: www.postgresql.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее