Почему круглые скобки используются в предложениях JOIN USING - PullRequest
0 голосов
/ 09 июня 2019

В следующем примере кода, почему мне нужно использовать круглые скобки () в предложениях JOIN, например, в JOIN PUBLISHER USING (Publisher_Code)?

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

SELECT 
Book_Title as 'Title',
Publisher_Name
FROM BOOK
JOIN PUBLISHER USING (Publisher_Code)
JOIN WROTE USING (Book_Code)
JOIN AUTHOR USING (Author_Num)
group by  Boo, k_Title, Publisher_Name
having count(distinct concat(LastName,FirstName)) = 2

Спасибо!

Ответы [ 3 ]

2 голосов
/ 09 июня 2019

Чтобы избежать двусмысленности.Допустим, вы сделали:

from a join
     b
     using c, d

SQL не будет знать, какие из них вы намереваетесь:

from a join
     b
     using (c, d)

или:

from a join
     b
     using c cross join
     d

Следовательно, стандарт требуеткруглые скобки.

1 голос
/ 09 июня 2019

Синтаксис Table1 JOIN Table2 ON <expr> принимает любое выражение, следующее за ON.Выражение может включать сравнения и логические термины.Выражения не обязательно должны иметь круглые скобки.

Синтаксис Table1 JOIN Table2 USING (<column-list>) не принимает выражение, он принимает только кортеж со списком столбцов внутри скобок.Понятно, что это логически эквивалентно серии логических терминов, разделенных AND, где каждый термин сравнивает столбец с одинаковым именем в обеих таблицах.

Table1 JOIN Table2 ON Table1.ColumnA = Table2.ColumnA
                  AND Table1.ColumnB = Table2.ColumnB

То же, что

Table1 JOIN Table2 USING (ColumnA, ColumnB)

Но это также то же самое, что и выражение с сравнением кортежей :

Table1 JOIN Table2 ON (Table1.ColumnA, Table1.ColumnB) = (Table2.ColumnA, Table2.ColumnB)

Сравнения кортежей требуют скобок для ясности приоритета оператора.

Теперь, когда мы видели сравнение кортежей, синтаксис USING больше похож на сокращенную версию этого.Это для кортежа имен столбцов без квалификаторов таблицы.

1 голос
/ 09 июня 2019

Синтаксис является частью ISO, и он был определен таким образом:

Лексические элементы - BNF

<named columns join> ::=
USING <left paren> <join column list> <right paren>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...