Не игнорируется в RIGHT JOIN
.
(Концептуально) Соединение происходит с примененным фильтром, после чего все несоответствующие строки из b
добавляются обратно.
Таким образом, запрос
SELECT a.c, b.c
FROM (select 1 AS c
UNION ALL
SELECT 2) a
RIGHT JOIN (select 1 AS c
UNION ALL
select 2 AS c) b
on a.c = b.c
and b.c = 1
Возвращает
c c
----------- -----------
1 1
NULL 2
Вы можете видеть, что, несмотря на то, что обе таблицы имеют 2
, дополнительный фильтр в предложении join
означает, что эти строки не объединяются.Однако, поскольку это right outer
объединение строки 2
из правой таблицы (b
), все еще появляется в результатах.
Редактировать: RE: Вопрос в комментариях
Тогда как мне LEFT JOIN
без добавления отфильтрованных строк обратно?Если вместо этого я использую предложение WHERE
, объединение будет медленнее, потому что потребуется объединить больше строк, верно?
Я не совсем понимаю этот вопрос.
Вы бы выбрали LEFT
против RIGHT
объединения на основе того, хотите ли вы сохранить все строки с левого или правого ввода.Для простого запроса к двум таблицам вы, конечно, можете использовать любой из них и просто изменить порядок таблиц в обратном порядке.
Аналогично для вопроса о том, следует ли помещать фильтр в условие WHERE
или условие JOIN
.В OUTER JOIN
это может изменить результаты (в моем примере перемещение данных b.c = 1
в предложение WHERE
означает, что будет возвращена только 1 строка, а не 2)
Для случая INNER JOIN
этоне имеет значения, где расположены фильтры, но я считаю более целесообразным размещать фильтры, касающиеся взаимосвязи между двумя таблицами в JOIN
и всеми другими в WHERE