Подтвердить что ты не робот

SQL JOIN, где установить условие WHERE?

У меня есть два следующих примера.

1. Пример (ГДЕ)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
 WHERE t2.field = true

2. Пример (JOIN AND)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id AND t2.field = true

Каков более быстрый способ с точки зрения производительности? Что вы предпочитаете?

4b9b3361

Ответ 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 объединяются.

Надеюсь, что это помогло.

Ответ 2

JOIN условия обычно не зависят от условий фильтра. Вы определяете правила своего соединения (как) с помощью ON. Вы фильтруете , что с WHERE. Производительность мудрая, нет общего правила для всех двигателей и конструкций, поэтому ваш пробег будет сильно отличаться.

Ответ 3

Я думаю, что более быстрый способ заключается в том, чтобы поместить фильтр в предложение where, потому что он будет выполнять этот фильтр в первом месте, а затем в предложении join, поэтому нет необходимости перестановки фильтров.