Ответ 1
Если фильтр входит в условие JOIN
функционально (т.е. это фактическое условие соединения, а не только фильтр), оно должно появиться в предложении ON
этого соединения.
Стоит отметить:
-
Если вы поместите его в предложение
WHERE
, то показатели будут одинаковыми, если соединениеINNER
, в противном случае оно отличается. Как упоминалось в комментариях, это не имеет особого значения, поскольку в любом случае результат отличается. -
Размещение фильтра в предложении
WHERE
, когда оно действительно является условиемOUTER JOIN
, неявно отменяет характер условияOUTER
( "join, даже если нет записей" ), поскольку эти фильтры подразумевают в первую очередь должны быть существующие записи. Пример:
... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5
правильный
... table1 t LEFT JOIN table2 u ON ...
WHERE t2.column = 5
неверно, поскольку t2.column = 5
сообщает движку, что ожидаются записи из t2, что противоречит внешнему соединению. Исключением для этого будет фильтр IS NULL
, такой как WHERE t2.column IS (NOT) NULL
(который на самом деле является удобным способом создания условных внешних соединений)
-
LEFT
иRIGHT
объединения неявноOUTER
объединяются.
Надеюсь, что это помогло.