Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос знатокам синтаксиса T_Sql  [new]
x-x
Member

Откуда:
Сообщений: 230
Добрый вечер, уважаемые коллеги.
Пример для вопроса тут :
+
declare @t1 table
(_id int identity(1,1) not null,
 _fld1 int)
 
declare @t2 table
(_id int identity(1,1) not null,
 _fld1 int,
 _fld2 int)

declare @t3 table
(_id int identity(1,1) not null,
 _fld2 int,
 _fld3 int)
 
insert into @t1
(_fld1)
select 1 union all  
select 2 union all
select 3 union all
select 4

insert into @t2
(_fld1, _fld2)
select 1,4 union all 
select 1,5 union all 
select 1,6 union all 
select 2,4 union all 
select 2,5 union all 
select 2,6 union all 
select 3,4 union all 
select 3,5 union all 
select 3,6

insert into @t3
(_fld2, _fld3)
select 4,7 union all 
select 5,8 union all 
select 6,9 union all 
select 4,7 union all 
select 5,8 union all 
select 6,9 union all 
select 4,7 union all 
select 5,8 union all 
select 6,9

-- select * from @t1
-- select * from @t2
-- select * from @t3

-- вариант 1
select * from 
 @t1 t1 
left join @t2 t2 on t1._fld1 = t2._fld1
inner join @t3 t3 on t3._fld2 = t2._fld2

-- вариант 2
select * from 
 @t1 t1 
left join @t2 t2 
 inner join @t3 t3 on t3._fld2 = t2._fld2
on t1._fld1 = t2._fld1



В коде я не использую ни скобок, ни force order.
Кто нибудь сможет привести ссылку на документацию, в которой описано такое поведение оптимизатора при соединении таблиц как в примере 2?
11 сен 09, 17:18    [7649274]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Все должно быть в синтаксисе оператора select, в части, касающейся кляузы from.
11 сен 09, 17:21    [7649287]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
x-x
Member

Откуда:
Сообщений: 230
Гавриленко Сергей Алексеевич
Все должно быть в синтаксисе оператора select, в части, касающейся кляузы from.

Я с этим согласен.
А в какой сточке этой статьи MSDN сказано, что мой синтаксис неверен? И почему, если я нарушаю синтаксис сервер меня не останавливает, а выполняет запрос?
Тут тоже ничего не нашел.
11 сен 09, 17:30    [7649336]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
x-x
Member

Откуда:
Сообщений: 230
Гавриленко Сергей Алексеевич
Все должно быть в синтаксисе оператора select, в части, касающейся кляузы from.
P.S. Сергей Алексеевич, а Вы, извините, пример то хоть смотрели?
11 сен 09, 17:32    [7649350]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну ведь явной ошибки то нет ,если уж честно смотреть.. ну указали ві условия обьединения не сразу за джойном... конечно с точки зрения буквоедства,ошибка якобі на лицо,но с чтоки зрения сервера которій сначала смотрит че делать,а только потом делает..помоему все честно, тем боле что плані идентичне построені под оба запроса
-------------------------------------
Jedem Das Seine
11 сен 09, 17:37    [7649378]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
x-x
И почему, если я нарушаю синтаксис сервер меня не останавливает, а выполняет запрос?
Вам кто-то говорил, что Вы нарушаете синтаксис?
Я могу написать для какой-то своей задачи написать в Excel формулу =2+2*2
А могу и =(2+2)*2
Очевидно, что обе эти формулы не могут решать одну и ту же задачу
С этой точки зрения да, одна из них неверна

Но ни в одном из случаев Excel меня не остановил, а послушно вычислил результат
Почему? Да просто не знает он, какую задачу я решаю
11 сен 09, 17:40    [7649392]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Паганель, так-то оно так, но вот я, например, смотрю на определение секции фром в статье про селект, и не вижу, чтобы можно было так делать.
11 сен 09, 17:45    [7649417]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Считайте, что второй запрос идентичен такому

select * from 
 @t1 t1 
left join (@t2 t2
inner join @t3 t3 on t3._fld2 = t2._fld2)
on t1._fld1 = t2._fld1
11 сен 09, 17:47    [7649434]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Le Peace
Паганель, так-то оно так, но вот я, например, смотрю на определение секции фром в статье про селект, и не вижу, чтобы можно было так делать.

Имхо тут

<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> [ ) ]
}
рекурсия с необязательными скобками
11 сен 09, 17:48    [7649440]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Glory
Имхо тут

<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> [ ) ]
}
рекурсия с необязательными скобками

Да, наверное, но ни фига не очевидно :)
11 сен 09, 18:03    [7649492]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Le Peace
Glory
Имхо тут

<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> [ ) ]
}
рекурсия с необязательными скобками

Да, наверное, но ни фига не очевидно :)

Это точно )
11 сен 09, 18:04    [7649500]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
x-x
Member

Откуда:
Сообщений: 230
Glory
Le Peace
Паганель, так-то оно так, но вот я, например, смотрю на определение секции фром в статье про селект, и не вижу, чтобы можно было так делать.

Имхо тут

<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'a указал.
И вопрос у меня всего навсего в том, что есть ли в документации что-нибудь на эту тему?
11 сен 09, 18:10    [7649538]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
x-x
Glory
Le Peace
Паганель, так-то оно так, но вот я, например, смотрю на определение секции фром в статье про селект, и не вижу, чтобы можно было так делать.

Имхо тут

<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'a указал.
И вопрос у меня всего навсего в том, что есть ли в документации что-нибудь на эту тему?
Хинтом - это как? FORCE ORDER что ли? Так он не задаёт порядок JOINов, а запрещает менять заданный.
Чем не устраивает цитата Glory? По-моему, исчерпывающе.
Если приглядеться, то скобки в JOINах совсем не нужны.
Порядок однозначно определяется последовательностью ключевых слов JOIN и ON
11 сен 09, 19:14    [7649769]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
x-x
Glory
Le Peace
Паганель, так-то оно так, но вот я, например, смотрю на определение секции фром в статье про селект, и не вижу, чтобы можно было так делать.

Имхо тут

<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'a указал.
И вопрос у меня всего навсего в том, что есть ли в документации что-нибудь на эту тему?

Hу так синтаксис | [ ( ] <joined_table> [ ) ] говорит как раз о том, что сервер все равно подставит за вас скобки. Явно скобки вы должны указывать, чтобы задавать порядок так, как вам хочется
11 сен 09, 19:19    [7649785]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
Явно скобки вы должны указывать, чтобы задавать порядок так, как вам хочется
Вот, не согласен. Скобки в JOINах лишние в любом случае.
Хотелось бы посмотреть на пример, в котором без скобок никак.
11 сен 09, 19:38    [7649823]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
Явно скобки вы должны указывать, чтобы задавать порядок так, как вам хочется
Вот, не согласен. Скобки в JOINах лишние в любом случае.
Хотелось бы посмотреть на пример, в котором без скобок никак.

Я не говорил про какие то задачи. Я говорил про то, что если скобок нет, то это не значит, что сервер их не ставит сам. В виртуальном смысле ставит конечно
11 сен 09, 21:06    [7650002]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
Вообще-то такой пример приводится у Kalen Delaney в "SQL Server 2005 Query Tuning and Optimization" (ISBN-13: 978-0-7356-2196-1)на странице 251. Именно как FORCE ORDER.
11 сен 09, 21:59    [7650163]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос знатокам синтаксиса T_Sql  [new]
x-x
Member

Откуда:
Сообщений: 230
Glory

Имхо тут
<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> [ ) ]
}
рекурсия с необязательными скобками

GlebZ

Вообще-то такой пример приводится у Kalen Delaney в "SQL Server 2005 Query Tuning and Optimization" (ISBN-13: 978-0-7356-2196-1)на странице 251. Именно как FORCE ORDER.

Спасибо большое.
14 сен 09, 13:34    [7655108]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить