Сервер Sql - Синтаксис внутреннего соединения с двумя соединениями - PullRequest
0 голосов
/ 18 января 2019

Я заметил, что один из наших программистов написал это:

SELECT * FROM Table_A A
  INNER JOIN Table_B B
    INNER JOIN Table_C C
      ON C.Id = B.Id
        ON B.Id = A.Id

Я не ожидал, что это сработает, но он возвращает результаты из нашей базы данных.

Это работает так же, как обычный синтаксис соединения? Я не могу найти документацию по нему.

1 Ответ

0 голосов
/ 18 января 2019

Да. Я обычно рекомендую, чтобы люди думали об этом, как будто 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 *. Но вы не должны полагаться на порядки столбцов.

...