Ответ 1
Ответ: НЕТ, но:
Я всегда предпочитаю делать следующее.
- Всегда сохраняйте условия присоединения в разделе
ON
- Всегда помещайте фильтр в предложение
where
Это делает запрос более удобочитаемым.
Итак, я буду использовать этот запрос:
SELECT value
FROM table1
INNER JOIN table2
ON table1.id = table2.id
WHERE table1.id = 1
Однако, когда вы используете OUTER JOIN'S
, существует большая разница в сохранении фильтра в состоянии ON
и where
.
Обработка логических запросов
В следующем списке содержится общая форма запроса, а также номера шагов, назначенные в соответствии с порядком, в котором логически обрабатываются различные статьи.
(5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list>
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>
| (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
| (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias>
| (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias>
(2) WHERE <where_predicate>
(3) GROUP BY <group_by_specification>
(4) HAVING <having_predicate>
(6) ORDER BY <order_by_list>;
Обработка логических запросов блок-схемы
-
(1) FROM: Фаза FROM идентифицирует исходные таблицы запросов и обрабатывает операторы таблиц. Каждый оператор таблицы применяет ряд подфаз. Например, фазы, участвующие в соединении, являются (1-J1) Декартово произведение, (1-J2) ON Filter, (1-J3) Добавить внешние строки. ОТ фаза генерирует виртуальную таблицу VT1.
-
(1-J1) Декартово произведение: эта фаза выполняет декартово произведение (перекрестное соединение) между двумя таблицами, участвующими в операторе таблицы, генерируя VT1-J1.
- (1-J2) Фильтр ON: эта фаза фильтрует строки из VT1-J1 на основе предикат, который появляется в предложении ON (< on_predicate > ). Только строки, для которых предикат имеет значение TRUE, вставляются в VT1-J2.
- (1-J3) Добавить внешние строки. Если указано OUTER JOIN (в отличие от CROSS JOIN или INNER JOIN), строки из сохраненного стола или таблиц для которых совпадение не было найдено, добавляются к строкам из VT1-J2 как внешние строки, генерирующие VT1-J3.
- (2) WHERE: эта фаза фильтрует строки из VT1 на основе предикат, который появляется в предложении WHERE(). Только строки, для которых предикат имеет значение TRUE, вставляются в VT2.
- (3) GROUP BY: Эта фаза упорядочивает строки из VT2 в группах на основе в списке столбцов, указанном в предложении GROUP BY, генерируя VT3. В конечном итоге, будет одна строка результатов для каждой группы.
- (4) HAVING: Эта фаза фильтрует группы из VT3 на основе предикат, который появляется в предложении HAVING (< having_predicate > ). Вставляются только группы, для которых предикат имеет значение TRUE. в VT4.
- (5) SELECT: Эта фаза обрабатывает элементы в предложении SELECT, генерируя VT5.
- (5-1) Оценка выражений: Эта фаза оценивает выражения в список SELECT, генерирующий VT5-1.
- (5-2) DISTINCT: Эта фаза удаляет повторяющиеся строки из VT5-1, генерируя VT5-2.
- (5-3) TOP: Эта фаза фильтрует указанное верхнее число или процент строк из VT5-2 на основе логического упорядочения, определенного ORDER BY, генерируя таблицу VT5-3.
- (6) ORDER BY: Эта фаза сортирует строки из VT5-3 в соответствии с список столбцов, указанный в предложении ORDER BY, генерирующий курсор VC6.
Отсылается от эта отличная ссылка.