Этот запрос:
SELECT *
FROM Table_a a LEFT JOIN
Table_b b
ON a.id = b.id INNER JOIN
Table_c c
ON b.id = c.id;
Эквивалентно:
SELECT *
FROM Table_a a INNER JOIN
Table_b b
ON a.id = b.id INNER JOIN
table_c c
ON b.id = c.id;
А?Как это превращается во внутреннее соединение?Ну, во-первых, теперь SQL интерпретируется слева направо, поэтому ваш запрос интерпретируется как:
SELECT *
FROM (Table_a a LEFT JOIN
Table_b b
ON a.id = b.id
) INNER JOIN
table_c c ON b.id = c.id;
То есть b
в последнем условии является результатом left join
.Если совпадений нет, то b.id
равно null
и условие не соответствует действительности.Следовательно, все эти строки отфильтрованы.
Я рекомендую следующие правила при работе с объединениями:
- Сначала поставьте все
INNER JOIN
. - Использование
LEFT JOIN
с для всех последующих объединений. - Не используйте
RIGHT JOIN
с.
Для меня это работает примерно для 99,9% запросов.В некоторых случаях предпочтительнее использовать альтернативные методы - для них я обычно использую подзапросы.