Да, если вы ссылаетесь на правую часть левого внешнего соединения в предложении where чем-либо, кроме «где myfield равно нулю», вы создали внутреннее соединение. Это потому, что он отфильтровывает все, что не соответствует этому условию, включая все записи, которые не соответствуют начальной таблице. То же самое с другими не внутренними соединениями. Чтобы обойти это, вы помещаете условие в соединение. Пример (это превращает его во внутреннее соединение):
Select field1, field2 from mytable mt
left join mytable2 mt2 on mt.id = m2.id
where mt1.field1 = 'hello' and mt2.field2 = 'test'
Переписано для сохранения левого соединения:
Select field1, field2 from mytable mt
left join mytable2 mt2 on mt.id = m2.id and mt2.field2 = 'test'
where mt1.field1 = 'hello'
Я также хочу прокомментировать то, что вы сказали в комментарии, но решил, что мой ответ будет слишком длинным для другого комментария.
"Выбрать ... из внутреннего соединения B на (A.id = B.a_id), C, D, F, где A.id = F.id"
для: "Выбрать ... из внутреннего соединения B на (A.id = B.a_id), C, D ВНУТРЕННЕГО СОЕДИНЕНИЯ F на A.id = F.a_id"
Вы не хотите комбинировать синтаксис, подобный этому; это становится очень трудно поддерживать. Фактически я рекомендую никогда не использовать синтаксис запятых старого стиля, так как он подвержен случайным перекрестным соединениям. Таким образом, в вашем примере я написал бы, чтобы получить набор результатов, который вы в настоящее время получаете (по крайней мере, кто-то из обслуживающих будет знать, что вы добавили перекрестное соединение вместо того, чтобы сделать это случайно):
Select ... From A
INNER JOIN B on A.id = B.a_id
INNER JOIN F on A.id = F.a_id
CROSS JOIN C
CROSS JOIN D
Альтернативно, если перекрестное соединение является случайным, код изменится на:
Select ... From A
INNER JOIN B on A.id = B.a_id
INNER JOIN F on A.id = F.a_id
INNER JOIN C on (fill in the join fields)
INNER JOIN D on (fill in the join fields)