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

Откуда:
Сообщений: 206
Не могу понять здесь рекурсия получается что ли?
Просто в моем понимании как происходит:
в первом селекте 1-й день месяца и название дня
объединяется со вторым днем и назанием дня. А вот дальше что происходит?
Зы: А где здесь форум по sql просто
WITH CTE AS
(
SELECT DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE())[FIRST SUNDAY DATE],DATENAME(DW,DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE()))[DAY NAME]
UNION ALL
SELECT DATEADD(D,1,[FIRST SUNDAY DATE]),DATENAME(DW,DATEADD(D,1,[FIRST SUNDAY DATE]))FROM CTE
)
SELECT [DAY NAME] FROM CTE
9 июл 13, 16:27    [14542394]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
boobonick
Зы: А где здесь форум по sql просто

А простоSQL это СУБД новая?

CTE рекурсивный. Возвращает вам список дат с названиями дней недели, начиная с первого числа текущего месяца. Сваливается по max recursion)
9 июл 13, 16:31    [14542419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
boobonick, Рекурсивные запросы, использующие обобщенные табличные выражения
9 июл 13, 16:31    [14542424]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
* А где здесь форум по sql просто есть?
9 июл 13, 16:31    [14542428]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Не могу понять здесь рекурсия получается что ли?


Да, ибо CTE использует само себя же.
9 июл 13, 16:32    [14542431]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
boobonick
* А где здесь форум по sql просто есть?


Это тот sql, который "просто СУБД" используют?
9 июл 13, 16:33    [14542444]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
boobonick
* А где здесь форум по sql просто есть?


форума "просто sql" здесь нету
http://ru.wikipedia.org/wiki/SQL
9 июл 13, 16:57    [14542623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
(C)
9 июл 13, 17:13    [14542699]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
StarikNavy
Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
(C)
CTE, однако, появился в ANSI SQL-99
9 июл 13, 17:18    [14542745]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
Ааааа, мой мозг разрывается просто=) Спасибо за ответы
9 июл 13, 18:20    [14543198]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
рекурсия в данном запросе бесконечная - надо как-нибудь ограничить
или так
SET ROWCOUNT 100
;WITH CTE AS
(
SELECT DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE())[FIRST SUNDAY DATE],DATENAME(DW,DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE()))[DAY NAME]
UNION ALL
SELECT DATEADD(D,1,[FIRST SUNDAY DATE]),DATENAME(DW,DATEADD(D,1,[FIRST SUNDAY DATE]))FROM CTE
)
SELECT [DAY NAME] FROM CTE 

или так
;WITH CTE AS
(
SELECT DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE())[FIRST SUNDAY DATE],DATENAME(DW,DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE()))[DAY NAME]
UNION ALL
SELECT DATEADD(D,1,[FIRST SUNDAY DATE]),DATENAME(DW,DATEADD(D,1,[FIRST SUNDAY DATE]))FROM CTE
WHERE [DAY NAME]<>'Sunday'
)
SELECT [DAY NAME] FROM CTE 

или еще как нибудь
10 июл 13, 07:05    [14544564]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
LexusR
или еще как нибудь


Угу. MAXRECURSION hint.
10 июл 13, 08:53    [14544749]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
pkarklin
LexusR
или еще как нибудь


Угу. MAXRECURSION hint.

Этот хинт не предназначен для ограничения бесконечной рекурсии.
10 июл 13, 08:56    [14544755]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Гость333
Этот хинт не предназначен для ограничения бесконечной рекурсии.


Всмылсе?!

WITH CTE AS
(
SELECT DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE())[FIRST SUNDAY DATE],DATENAME(DW,DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE()))[DAY NAME]
UNION ALL
SELECT DATEADD(D,1,[FIRST SUNDAY DATE]),DATENAME(DW,DATEADD(D,1,[FIRST SUNDAY DATE]))FROM CTE
)
SELECT [DAY NAME] FROM CTE OPTION (MAXRECURSION 5)


DAY NAME
------------------------------
понедельник
вторник
среда
четверг
пятница
суббота
Msg 530, Level 16, State 1, Line 1
Выполнение инструкции прервано. Максимальная рекурсия 5 была использована до завершения инструкции.
10 июл 13, 09:01    [14544777]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
pkarklin
пропущено...


Угу. MAXRECURSION hint.

Этот хинт не предназначен для ограничения бесконечной рекурсии.

То есть, конечно, сам по себе не предназначен. Без него не обойтись.
Способ ограничения рекурсии до заданного уровня видится таким:
with cte as
(
  select ..., 1 as level from ...
  union all
  select ..., cte.level+1 as level from ... where cte.level < @MaxLevel
)
select * from cte option(maxrecursion 0)
10 июл 13, 09:03    [14544786]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
pkarklin
Гость333
Этот хинт не предназначен для ограничения бесконечной рекурсии.


Всмылсе?!

... OPTION (MAXRECURSION 5)


DAY NAME
------------------------------
понедельник
вторник
среда
четверг
пятница
суббота
Msg 530, Level 16, State 1, Line 1
Выполнение инструкции прервано. Максимальная рекурсия 5 была использована до завершения инструкции.

Я имел в виду, что использование хинта самого по себе приводит к ошибке 530, а это плохо, если, скажем, код обёрнут в try-catch :-)
10 июл 13, 09:07    [14544800]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
А не подскажете, возможно ли как-то cte применить, чтобы получить количество понедельников, вторников, сред... воскресений месяца при заданной дате.
Т.е.:
data mon tue .... sun
1.02.2012 4 5 3
6.07.2011 3 4 5

Вот в таком ключе
11 июл 13, 13:06    [14551935]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Можно, нкжная вам ф-ция называеться
DATENAME
select DATENAME ( dw , getdate() )
11 июл 13, 13:28    [14552106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Maxx,
а действительно... я было начал задумываться о мат.аппарате...
А все проще - развернуть месяц по дням, для каждого дня вычислить номер дня недели, свернуть в count по дням недели - и никакой математики... :)
11 июл 13, 13:40    [14552206]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
ДА, такие же мысли, только не номер дня недели, а сразу название, потом соответсвенно выборку по дню и подсчет. Но я не понимаю
вот есть столбец понедельник, вторник..воскресение - как его вывести?
11 июл 13, 13:46    [14552261]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
pivot?
11 июл 13, 13:48    [14552280]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
boobonick
data mon tue .... sun
1.02.2012 4 5 3
6.07.2011 3 4 5

простите конечно,но как 1.02.2012 может содержать 4 понедельника,5 вторников и еще 3 воскресения ?
Развернуть просто PIVOT (гаратированные 7 колонок, если у вас не собственный календарь )
11 июл 13, 13:50    [14552295]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Maxx,
месяц, в котором есть дата 1.02.2012 - может :)
11 июл 13, 14:11    [14552445]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
XD
11 июл 13, 14:15    [14552472]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять CTE  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Cygapb-007,

незнаю , может у них свой календарь
11 июл 13, 14:17    [14552485]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить