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

Откуда:
Сообщений: 34
Доброго времени суток.
Имеется подобная таблица:

IdParentName
10Администрация
20Филиал 1
30Филиал 2
42Бухгалтерия
53Делопроизводители
64Группа тех. работ
74Группа по работе с персоналом
85Группа раз
95Группа два


Хочу создать представление вида:

IdParentName
10Администрация
20Филиал 1
30Филиал 2
42Филиал 1
53Филиал 2
64Филиал 1
74Филиал 1
85Филиал 2
95Филиал 2


Т.е. чтобы либо сразу в Name родитель был, либо может новый столбец создать лучше... Пробовал этим способом, но это не то что мне надо. Не знаю как описать в поиске
26 ноя 18, 13:24    [21744884]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
WITH Data AS
(
 SELECT * FROM(VALUES
  (1,0,'Администрация')
 ,(2,0,'Филиал 1')
 ,(3,0,'Филиал 2')
 ,(4,2,'Бухгалтерия')
 ,(5,3,'Делопроизводители')
 ,(6,4,'Группа тех. работ')
 ,(7,4,'Группа по работе с персоналом')
 ,(8,5,'Группа раз')
 ,(9,5,'Группа два')
 ,(10,9,'Группа три'))T(Id,Parent,Name)
)
,
CTE(Id,Parent,Name) AS
(
 SELECT Id,Parent,Name FROM Data WHERE Parent=0
 UNION ALL
 SELECT Data.Id,Data.Parent,CTE.Name
 FROM CTE JOIN Data ON CTE.Id=Data.Parent
)
SELECT *
FROM CTE
ORDER BY Id;
26 ноя 18, 14:12    [21744978]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
KOHHEKTOP
Member

Откуда:
Сообщений: 34
Забыл ссылку добавить какой способ применял.

p.s. А если строк более 1000 ?
26 ноя 18, 14:34    [21745014]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
KOHHEKTOP
Забыл ссылку добавить какой способ применял.

p.s. А если строк более 1000 ?
После ORDER BY (но до точки с запятой!)
добавьте OPTION(MAXRECURSION 0)
26 ноя 18, 14:38    [21745020]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
KOHHEKTOP
Member

Откуда:
Сообщений: 34
iap,

Спасибо. У меня этой таблицей является Departments. Такой код не хочет работать:

with Data as
(
select * from Departments T (Id. Parent, Name)
)
,
CTE (Id, Parent, Name) AS
(
select Id, Parent, Name from Data where parent=0
union all
select Data.Id, Data.Parent, CTE.Name
from CTE Join data on CTE.Id=Data.Parent
)
select * from CTE order by OPTION(MAXRECURSION 0) id;
26 ноя 18, 14:47    [21745035]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KOHHEKTOP,

мдя

 order by  id OPTION(MAXRECURSION 0);
26 ноя 18, 14:48    [21745037]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
KOHHEKTOP
Member

Откуда:
Сообщений: 34
TaPaK,

Даже так не хочет.
Неправильный синтаксис около ключевого слова "OPTION"
и ещё
Id является не известным параметром табличных подсказок
26 ноя 18, 14:54    [21745045]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KOHHEKTOP
TaPaK,

Даже так не хочет.
Неправильный синтаксис около ключевого слова "OPTION"
и ещё
Id является не известным параметром табличных подсказок

а это как так?
select * from Departments T (Id. Parent, Name)
26 ноя 18, 14:57    [21745048]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
KOHHEKTOP
Member

Откуда:
Сообщений: 34
TaPaK,

меня это смутило немного. Если убрать букву Т или то, что сзади него (вместе с ней), то вторая ошибка пропадает.
26 ноя 18, 15:00    [21745053]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KOHHEKTOP
TaPaK,

меня это смутило немного. Если убрать букву Т или то, что сзади него (вместе с ней), то вторая ошибка пропадает.

Time to RTFM!
26 ноя 18, 15:02    [21745058]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
KOHHEKTOP
TaPaK,

Даже так не хочет.
Неправильный синтаксис около ключевого слова "OPTION"
и ещё
Id является не известным параметром табличных подсказок
Скопипастите сюда запрос, на который сервер так ругается.
Id случайно не в скобках остался? Впрочем, это уже гадание.
И напишите здесь результат запроса
PRINT @@VERSION;

P.S. Хочется спросить: а вы про ORDER BY раньше ничего не слышали?
26 ноя 18, 15:02    [21745059]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
KOHHEKTOP
TaPaK,

меня это смутило немного. Если убрать букву Т или то, что сзади него (вместе с ней), то вторая ошибка пропадает.
Первое CTE у меня - это всего лишь имитация заполненной таблицы.
Чтобы писать для конкретных данных, похожих на ваши.
Вместо этого CTE надо просто применять имя своей настоящей таблицы.
26 ноя 18, 15:06    [21745064]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
KOHHEKTOP
Member

Откуда:
Сообщений: 34
iap,

with Data as
(
select * from Departments 
)
,
CTE (Id, Parent, Name) AS
(
select Id, Parent, Name from Data where parent=0
union all
select Data.Id, Data.Parent, CTE.Name
from CTE Join data on CTE.Id=Data.Parent
)
select * from CTE order by OPTION(MAXRECURSION 0);


print @@version
Microsoft SQL Server 2008 R2 (SP3-GDR) (KB4057113) - 10.50.6560.0 (X64)
Dec 28 2017 15:03:48
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

-----------------------
Про order by знаю что это сортировка по столбцу по убыванию/возрастанию.
Если вставляю вместо CTE свою таблицу (Departments), то ошибка всё равно остаётся
26 ноя 18, 15:09    [21745070]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KOHHEKTOP,

select * from CTE order by OPTION(MAXRECURSION 0);

ALT + F4
26 ноя 18, 15:10    [21745071]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
order by  ???


по какому столбцу сортируете, вам уже 2 раза на справку намекают
26 ноя 18, 15:12    [21745073]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
KOHHEKTOP
Member

Откуда:
Сообщений: 34
Мда... действительно ALT + F4
Простите, пожалуйста, за мою тупость.
И Спасибо большое за помощь.

Пойду свой стыд и срам умывать...
26 ноя 18, 15:14    [21745074]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KOHHEKTOP,

в догонку

+
Картинка с другого сайта.
26 ноя 18, 15:15    [21745076]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить