Да. Я обычно рекомендую, чтобы люди думали об этом, как будто JOIN
действует так же, как открывающая скобка (
, а ON
действует так же, как закрывающая скобка )
. Тогда обычные правила, которые вы используете для сопоставления скобок, сообщают вам , какое ON
предложение относится к , JOIN
, и дает вам некоторый контекст для определения того, какие имена / псевдонимы таблиц находятся в области видимости.
Таким образом, этот запрос эффективно объединяет таблицу B
с таблицей C
, а затем соединяет A
с , что объединенный результат.
Я бы обычно рекомендовал против этого, когда просто использовал INNER JOIN
с - вы можете легко переставить таблицы так, чтобы вы следовали более «нормальному» шаблону JOIN
/ ON
/ JOIN
/ ON
. Вы получите тот же логический результат этого запроса 1 :
SELECT *
FROM Table_B B
INNER JOIN Table_C C
ON C.Id = B.Id
INNER JOIN Table_A A
ON B.Id = A.Id
Обратите внимание, что это включено в документацию , если вы внимательно ее прочитали:
<table_source> ::=
{
table_or_view_name [ [ AS ] table_alias ]
[ <tablesample_clause> ]
[ WITH ( < table_hint > [ [ , ]...n ] ) ]
...
| <joined_table>
...
И
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
...
Итак, в <joined_table>
, что происходит слева от <join_type>
? Любой <table_source>
. А что идет справа от <join_type>
? Любой <table_source>
. И любой из них или оба могут быть на самом деле <joined_table>
.
"Нормальная" форма, на которую вы ссылаетесь в своем вопросе, - это то, что выпадает, если мы только позволим себе использовать <joined_table>
в левой позиции другого <joined_table>
.
1 Хотя если вы полагаетесь на столбец order вместо столбца names , вы получите столбцы в другом порядке из-за использования SELECT *
. Но вы не должны полагаться на порядки столбцов.