Как работает этот синтаксис SQL? Многократное левое соединение с одиночным включением - PullRequest
0 голосов
/ 18 сентября 2018

Я наткнулся на оператор T-SQL, показанный ниже, и я не знаю, как создаются соединения для такого синтаксиса:

SELECT TOP (1000) e2.[Id]
FROM [Sandbox].[dbo].[Employee] as e2
LEFT JOIN Employee AS e1 
LEFT JOIN Employee AS e3 ON e1.Id = e3.Id

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Если вы посмотрите на синтаксис на сайте MSDN: FROM (Transact-SQL) , вы получите что-то вроде этого:

<joined_table> ::=   
{  
    <table_source> <join_type> <table_source> ON <search_condition>   
    | <table_source> CROSS JOIN <table_source>   
    | left_table_source { CROSS | OUTER } APPLY right_table_source   
    | [ ( ] <joined_table> [ ) ]   
}  
<join_type> ::=   
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]  
    JOIN  

, где вы видите (не очень ясно :)), что у каждого JOIN должно быть предложение ON, кроме CROSS JOIN.

Существует одно исключение, когда вы помещаете условие JOIN в предложение WHERE, как показано ниже:

select * from t1, t2
where t1.id = t2.t1_id

Поскольку я не вижу ни одного предложения WHERE в вашем запросе, этот запрос не будет работать, вы получите что-то вроде этого:

Сообщение 102, Уровень 15, Состояние 1, Строка 6 Неверный синтаксис рядом с 'e1'.

0 голосов
/ 18 сентября 2018

Я бы сказал, что то, что вы показываете, не является полным утверждением (если оно выполняется без ошибок), и есть более поздний ON, который вы проигнорировали.Думайте о JOIN и ON так же, как об открывающих и закрывающих скобках.Они должны совпадать, и правила сопоставления скобок / скобок также работают для определения, к какому JOIN определенному предложению ON относится.

Здесь вы показали нам предложение ON, котороеотносится к JOIN между e1 и e3.Есть еще одно предложение ON, которое затем контролирует JOIN между e2 и (e1 joined to e3).

0 голосов
/ 18 сентября 2018

Я думаю, что это даст синтаксическую ошибку. Потому что в First Left Join нет условия ON, поэтому оно не будет работать. Но вы можете использовать левое соединение с одной таблицей при изменении псевдонима в соответствии с некоторыми условиями, он работает нормально. Не могли бы вы дать более подробное разъяснение вашего вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...