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

Откуда:
Сообщений: 14
Разъясните плиз, что делает данный скрипт?


select id+1,l-id-1
from
(select id,(select top 1 id from test t2 where t2.id>t1.id order by id)l
from test t1)t
where id<l-1


спасибо)
8 фев 12, 19:14    [12057383]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
FromXF, а запустить и поглядеть не судьба? Что именно в нем вам не ясно?
8 фев 12, 19:21    [12057430]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
FromXF
Member

Откуда:
Сообщений: 14
kDnZP, я знаю, что он делает, мне не понятен синтаксис.

Сама задача звучит, как :

есть одна таблица с 1 полем. Поле заполнено числами по порядку: {1,2,4,7,8,11...}.
Мне нужно написать такой скрипт, который делает следующее(2столбца): {{3,1},{9,2}...}.
Как Вы можете заметить, мы сначала записываем то число, с которого начался пропуск в последовательности,
а на второй позиции пишем кол-во пропущенных цифр, т.е. разницу ( 4-3 это для первой скобки,
11-9 для второй).

Еще раз, мне не понятен сам синтаксис,т.к. только начинаю изучать SQL.
8 фев 12, 19:28    [12057464]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
FromXF
Еще раз, мне не понятен сам синтаксис,т.к. только начинаю изучать SQL.

Э... а мне непонятно, что именно в синтаксисе вам непонятно.
select (выбрать) ... набор полей ... from (из) ... откедова (в вашем случае из подзапроса) ... where (где) ... фильтр

Что тут неясного? Может вам надобно сходить и почитать BOL, там про SELECT много написано, со всеми кляузами и примерами. Либо возьмите книжку какую-нить почитайте.
8 фев 12, 20:09    [12057738]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
FromXF
Member

Откуда:
Сообщений: 14
kDnZP,
1. Для чего в данном случае мы используем select top 1 ?

2. from test t2 - здесь мы берем данные из таблицы test, используя мнимое название t2?

3. Для чего группируем по id? order by id

4. Для чего указываем "t" в конце с скобки from test t1)t и "l" после предыдущей?
8 фев 12, 20:14    [12057788]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
FromXF,
1. Для того, чтобы получить одну запись из множества
2. t2 - псевдоним (alias), в данном случае используется для кореллированного подзапроса.
3. Это сортировка, а не группировка. Сортировка нужна для получения набора в отсортированном виде.
4. См. пункт 2. про подзапросы и алиасы. "l" - название столбца в подзапросе.
8 фев 12, 20:19    [12057819]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
iljy
Member

Откуда:
Сообщений: 8711
FromXF
kDnZP,
1. Для чего в данном случае мы используем select top 1 ?

2. from test t2 - здесь мы берем данные из таблицы test, используя мнимое название t2?

3. Для чего группируем по id? order by id

4. Для чего указываем "t" в конце с скобки from test t1)t и "l" после предыдущей?

1. Top 1 - во избежание ситуации, когда кореллированный подзапрос вернет нам более одной записи. Уберите его и посмотрите, что произойдет.
2. Задаем в качестве источника записей таблицу test и присваиваем ей псевдоним t2 для обращения к ее полям, этот псевдоним существует в контесте вложенного (SELECTTOP 1 ...). В принципе в данном конкретном случае можно обойтись и без псевдонима t2, сервер поймет, что обращение к полю id без модификаторов идет к ближайшей по контексту таблице, но, если в запросе используется более одного обращения к таблицам (да в принципе даже если и одно), рекомендуется всегда использовать псевдонимы, в первую очередь - для облегчения чтения себе любимому.
3. Не группируем, а упорядочиваем. Чтобы выбрать запись с минимальным id (упорядочиваем по возрастанию id и берем только первую).
4. l - это присваивание имени полю, значением которого является возврат кореллированного подзапроса, сервер допускает безымянные поля только в самом внешнем select, да и там не рекомендуется. Иначе как бы вы смогли обратится к значению в последующем where?
t - это присваивание псевдонима набору данных, ток же синтаксическое требование. Можете кстати писать полный синтаксис:
select id+1, l-id-1
from
(
   select id, (select top 1 id from test as t2 where t2.id>t1.id order by id) as l
   from test as t1
) as t
where id<l-1

может так будет понятнее.
8 фев 12, 20:28    [12057853]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
FromXF
Member

Откуда:
Сообщений: 14
iljy,kDnZP спасибо
8 фев 12, 20:29    [12057858]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с запросом.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
kDnZP
FromXF,
1. Для того, чтобы получить одну запись из множества
2. t2 - псевдоним (alias), в данном случае используется для кореллированного подзапроса.
3. Это сортировка, а не группировка. Сортировка нужна для получения набора в отсортированном виде.
4. См. пункт 2. про подзапросы и алиасы. "l" - название столбца в подзапросе.
4. "l" - это алиас производной таблицы (derived table)
См. http://msdn.microsoft.com/ru-ru/library/ms177634(v=sql.100).aspx

Ещё лучше, если разберётесь с SELECTом в целом. Но это вряд ли с первого раза...
8 фев 12, 20:30    [12057860]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить