Результаты отличаются: условие в ON сохраняет все строки A, подставляя NULL для отсутствующего совпадения B; условие в WHERE отбрасывает эти строки и оставляет только id = 1.
Представлены таблицы A и B:
Результаты отличаются: условие в 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.