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

Откуда:
Сообщений: 2
Добрый вечер!
Подскажите, пожалуйста, как корректно написать обход дерева по таблице с id, parent_id чтобы в результате была конкатенация
строки верхнего уровня (поел с названием), а за ней перечисление всех id, через точку.

Т.е. если есть таблица
http://screenshot.ru/upload/image/zIzh

То как получить такой результат?
http://screenshot.ru/upload/image/zIzP

Спасибо!
20 фев 17, 22:27    [20231019]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
iljy
Member

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

пишете рекурсивное CTE, делаете обход дерева, при обходе накапливаете строку так, как вам надо.
20 фев 17, 22:43    [20231053]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1814
;with cte as
(
  select id, parentid, cast(id as nvarchar(max) as ttt) + N'.' from a
  where id = 1
  union all
  select id, parentid, cte.ttt + cast(a.id as nvarchar(max)) from a
  join cte on cte.id = a.parentid
)
select * from cte

могу ошибаться, как-то так..
21 фев 17, 00:43    [20231271]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос  [new]
CTE_NEWBI
Member

Откуда:
Сообщений: 2
Спасибо за подсказку!
В итоге получился вот такой рабочий запрос:
;with cte as
(
  select wbs_id, parent_wbs_id, cast(wbs_name as nvarchar(max)) + N'.' as ttt from PROJWBS
  where wbs_id = :wbs_id
  union all
  select PROJWBS.wbs_id, PROJWBS.parent_wbs_id, space (4) +  cte.ttt + cast(PROJWBS.wbs_short_name as nvarchar(max)) +'.' from PROJWBS
  join cte on cte.wbs_id = PROJWBS.parent_wbs_id
)
select * from cte
21 фев 17, 11:35    [20232324]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить