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

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

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

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

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

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

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

Угу. MAXRECURSION hint.
Этот хинт не предназначен для ограничения бесконечной рекурсии.
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38326287
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость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
Помогите понять CTE
    #38326290
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость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
Помогите понять CTE
    #38326293
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите понять CTE
    #38328011
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не подскажете, возможно ли как-то cte применить, чтобы получить количество понедельников, вторников, сред... воскресений месяца при заданной дате.
Т.е.:
data mon tue .... sun
1.02.2012 4 5 3
6.07.2011 3 4 5

Вот в таком ключе
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328040
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, нкжная вам ф-ция называеться
DATENAME
Код: sql
1.
select DATENAME ( dw , getdate() )
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328056
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxx,
а действительно... я было начал задумываться о мат.аппарате...
А все проще - развернуть месяц по дням, для каждого дня вычислить номер дня недели, свернуть в count по дням недели - и никакой математики... :)
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328079
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДА, такие же мысли, только не номер дня недели, а сразу название, потом соответсвенно выборку по дню и подсчет. Но я не понимаю
вот есть столбец понедельник, вторник..воскресение - как его вывести?
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328083
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pivot?
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328088
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите понять CTE
    #38328128
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxx,
месяц, в котором есть дата 1.02.2012 - может :)
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328135
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XD
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328139
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

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


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