Собесов

Может ли измениться результат запроса, если в LEFT JOIN поменять таблицы местами?

SQLJOIN-ыЛёгкаяJunior

Условие

Может ли измениться результат запроса, если в LEFT JOIN поменять таблицы местами?

-- Было
SELECT * FROM A LEFT JOIN B ON A.id = B.a_id;
 
-- Стало
SELECT * FROM B LEFT JOIN A ON A.id = B.a_id;

Решение

Да, результат изменится — порядок таблиц в LEFT JOIN важен.

LEFT JOIN означает: «верни все строки левой таблицы, и для них — совпадения из правой; если совпадения нет — NULL в полях правой».

При перестановке таблиц местами «ведущей» становится другая таблица. Если в A есть строки без пары в B, в первом запросе они окажутся с NULL в полях B. Во втором запросе ведущая — B, и эти строки A просто не попадут в результат, зато попадут все строки B (даже без пары в A).

Эквивалентно эту перестановку можно записать как A RIGHT JOIN B — это тождественно B LEFT JOIN A.

Когда результат не изменится

Только если соответствие строго взаимно-однозначное и без «висячих» строк в обеих таблицах — тогда LEFT JOIN, RIGHT JOIN и INNER JOIN дают одинаковое множество строк. Но это редкий и особый случай.

Подводные камни

  1. Считать, что LEFT JOIN симметричен. Это асимметричная операция, ведущая всегда левая.
  2. Путать с INNER JOIN. У INNER JOIN перестановка таблиц местами действительно не меняет результат (с точностью до порядка столбцов в *).
  3. Считать, что LEFT JOIN A B = RIGHT JOIN B A. Правильно: A LEFT JOIN B = B RIGHT JOIN A.

Эталонный ответ

Да, результат изменится (если только во второй таблице нет строк без пары в первой).

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти