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

Откуда:
Сообщений: 302
Подскажите, как с помощью обобщенного табличного выражения
из таблицы структуры
key_id,parent_id,name

с данными, например:
1,null,'aaa'
2,1,'bbb'
3,2,'ccc'
4,3,'ddd'

получить в результате запроса имена всех родителей в одном поле через запятую.
'aaa,bbb,ccc' для key_id=4
5 май 09, 10:07    [7145914]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
declare @t table(id int, parent int, name varchar(10))
insert into @t(id, parent, name)
select 1, null, 'aaa' union all
select 2,    1, 'bbb' union all
select 3,    2, 'ccc' union all
select 4,    3, 'ddd'

declare @id int
set @id = 4

;with cte as (
   select cast(null as varchar(max)) as path
         ,parent
     from @t
    where id = @id
   union all
   select cast(isnull(name + ',' + path, name) as varchar(max)) as path
         ,t.parent
     from @t  as t
     join cte as c on c.parent = t.id
)
select path
  from cte
 where parent is null
     
path
-------------------
aaa,bbb,ccc

(1 row(s) affected)
5 май 09, 10:14    [7145954]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
foxwizard
Member

Откуда:
Сообщений: 302
Спасибо!
5 май 09, 10:18    [7145975]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
Jetus
Member

Откуда: Украина, Хмельницкий
Сообщений: 741
А в 2000-ом как?
28 май 09, 14:03    [7239575]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
Roamer
Member

Откуда: г.Краснодар
Сообщений: 38
https://www.sql.ru/faq/faq_topic.aspx?fid=130
28 май 09, 14:09    [7239614]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
_djХомяГ
Guest
Jetus
А в 2000-ом как?

возможно так можно
declare @val varchar(100)
set @val=''
select @val=@val+t1.name+',' from #t t left join #t t1 on t.parent=t1.id where t1.id is not null
select LEFT(@val,len(@val)-1)
28 май 09, 15:11    [7240162]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
vino
Member

Откуда:
Сообщений: 1191
_djХомяГ
Jetus
А в 2000-ом как?

возможно так можно...

На этих данных можно
Но в общем случае без цикла/рекурсии не обойтись. Например, так
declare @t table(id int, parent int, name varchar(10))
insert into @t(id, parent, name)
select 1, null, 'aaa' union all
select 2,    1, 'bbb' union all
select 5,    1, 'ccc' union all
select 3,    2, 'ccc' union all
select 4,    3, 'ddd'

declare @val varchar(100), @id int
select @val = '', @id = parent from  @t where id = 4 
while @id > 0 select @val=name+','+@val, @id = parent from @t where id=@id
select LEFT(@val,len(@val)-1)
28 май 09, 18:27    [7241516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить