Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять CTE / 25 сообщений из 38, страница 1 из 2
09.07.2013, 16:27
    #38325768
boobonick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Не могу понять здесь рекурсия получается что ли?
Просто в моем понимании как происходит:
в первом селекте 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
...
Рейтинг: 0 / 0
09.07.2013, 16:31
    #38325773
Сергей Викт.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
boobonickЗы: А где здесь форум по sql просто

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

CTE рекурсивный. Возвращает вам список дат с названиями дней недели, начиная с первого числа текущего месяца. Сваливается по max recursion)
...
Рейтинг: 0 / 0
09.07.2013, 16:31
    #38325774
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
...
Рейтинг: 0 / 0
09.07.2013, 16:31
    #38325776
boobonick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
* А где здесь форум по sql просто есть?
...
Рейтинг: 0 / 0
09.07.2013, 16:32
    #38325777
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
авторНе могу понять здесь рекурсия получается что ли?

Да, ибо CTE использует само себя же.
...
Рейтинг: 0 / 0
09.07.2013, 16:33
    #38325780
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
boobonick* А где здесь форум по sql просто есть?

Это тот sql, который "просто СУБД" используют?
...
Рейтинг: 0 / 0
09.07.2013, 16:57
    #38325826
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
boobonick* А где здесь форум по sql просто есть?

форума "просто sql" здесь нету
http://ru.wikipedia.org/wiki/SQL
...
Рейтинг: 0 / 0
09.07.2013, 17:13
    #38325856
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
(C)
...
Рейтинг: 0 / 0
09.07.2013, 17:18
    #38325874
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
StarikNavyОтступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92 , многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
(C)CTE, однако, появился в ANSI SQL-99
...
Рейтинг: 0 / 0
09.07.2013, 18:20
    #38325981
boobonick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Ааааа, мой мозг разрывается просто=) Спасибо за ответы
...
Рейтинг: 0 / 0
10.07.2013, 07:05
    #38326225
LexusR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
рекурсия в данном запросе бесконечная - надо как-нибудь ограничить
или так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 


или так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
;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 


или еще как нибудь
...
Рейтинг: 0 / 0
10.07.2013, 08:53
    #38326283
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
LexusRили еще как нибудь

Угу. MAXRECURSION hint.
...
Рейтинг: 0 / 0
10.07.2013, 08:56
    #38326284
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
pkarklinLexusRили еще как нибудь

Угу. MAXRECURSION hint.
Этот хинт не предназначен для ограничения бесконечной рекурсии.
...
Рейтинг: 0 / 0
10.07.2013, 09:01
    #38326287
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Гость333Этот хинт не предназначен для ограничения бесконечной рекурсии.

Всмылсе?!

Код: sql
1.
2.
3.
4.
5.
6.
7.
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)



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DAY NAME
------------------------------
понедельник
вторник
среда
четверг
пятница
суббота
Msg 530, Level 16, State 1, Line 1
Выполнение инструкции прервано. Максимальная рекурсия 5 была использована до завершения инструкции.
...
Рейтинг: 0 / 0
10.07.2013, 09:03
    #38326290
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Гость333pkarklinпропущено...


Угу. MAXRECURSION hint.
Этот хинт не предназначен для ограничения бесконечной рекурсии.
То есть, конечно, сам по себе не предназначен. Без него не обойтись.
Способ ограничения рекурсии до заданного уровня видится таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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)
...
Рейтинг: 0 / 0
10.07.2013, 09:07
    #38326293
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
pkarklinГость333Этот хинт не предназначен для ограничения бесконечной рекурсии.

Всмылсе?!

Код: sql
1.
... OPTION (MAXRECURSION 5)



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DAY NAME
------------------------------
понедельник
вторник
среда
четверг
пятница
суббота
Msg 530, Level 16, State 1, Line 1
Выполнение инструкции прервано. Максимальная рекурсия 5 была использована до завершения инструкции.

Я имел в виду, что использование хинта самого по себе приводит к ошибке 530, а это плохо, если, скажем, код обёрнут в try-catch :-)
...
Рейтинг: 0 / 0
11.07.2013, 13:06
    #38328011
boobonick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
А не подскажете, возможно ли как-то cte применить, чтобы получить количество понедельников, вторников, сред... воскресений месяца при заданной дате.
Т.е.:
data mon tue .... sun
1.02.2012 4 5 3
6.07.2011 3 4 5

Вот в таком ключе
...
Рейтинг: 0 / 0
11.07.2013, 13:28
    #38328040
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Можно, нкжная вам ф-ция называеться
DATENAME
Код: sql
1.
select DATENAME ( dw , getdate() )
...
Рейтинг: 0 / 0
11.07.2013, 13:40
    #38328056
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Maxx,
а действительно... я было начал задумываться о мат.аппарате...
А все проще - развернуть месяц по дням, для каждого дня вычислить номер дня недели, свернуть в count по дням недели - и никакой математики... :)
...
Рейтинг: 0 / 0
11.07.2013, 13:46
    #38328079
boobonick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
ДА, такие же мысли, только не номер дня недели, а сразу название, потом соответсвенно выборку по дню и подсчет. Но я не понимаю
вот есть столбец понедельник, вторник..воскресение - как его вывести?
...
Рейтинг: 0 / 0
11.07.2013, 13:48
    #38328083
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
pivot?
...
Рейтинг: 0 / 0
11.07.2013, 13:50
    #38328088
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
boobonickdata mon tue .... sun
1.02.2012 4 5 3
6.07.2011 3 4 5
простите конечно,но как 1.02.2012 может содержать 4 понедельника,5 вторников и еще 3 воскресения ?
Развернуть просто PIVOT (гаратированные 7 колонок, если у вас не собственный календарь )
...
Рейтинг: 0 / 0
11.07.2013, 14:11
    #38328128
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Maxx,
месяц, в котором есть дата 1.02.2012 - может :)
...
Рейтинг: 0 / 0
11.07.2013, 14:15
    #38328135
boobonick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
XD
...
Рейтинг: 0 / 0
11.07.2013, 14:17
    #38328139
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять CTE
Cygapb-007,

незнаю , может у них свой календарь
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять CTE / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]