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

Откуда: НН
Сообщений: 179
Microsoft SQL Server 2005 - 9.00.5057.00 (X64)   Mar 25 2011 13:33:31   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 

Раньше деревья строить не приходилось. Темы соответствующие читал, пытался пойти по аналогичному пути. Помыкался немного - не выходит каменный цветок...
declare @id TABLE (id int)
insert into @id (id) values (1)
insert into @id (id) values (2)
insert into @id (id) values (3)
insert into @id (id) values (4)
insert into @id (id) values (5)
insert into @id (id) values (6)
insert into @id (id) values (7)
insert into @id (id) values (8)

declare @event TABLE (id int, related_id int)
insert into @event (id, related_id) values (3,2)
insert into @event (id, related_id) values (2,1)
insert into @event (id, related_id) values (6,5)
insert into @event (id, related_id) values (8,NULL)
insert into @event (id, related_id) values (8,NULL)
insert into @event (id, related_id) values (7,NULL)
insert into @event (id, related_id) values (6,NULL)
insert into @event (id, related_id) values (5,NULL)
insert into @event (id, related_id) values (3,NULL)
insert into @event (id, related_id) values (2,NULL)
insert into @event (id, related_id) values (1,NULL)

Есть справочник неких объектов (@id) и регистр событий этих объектов (@event). Событие с непустым related_id означает, что объект related_id был заменён объектом id. Событий по объекту может не быть вообще. Нужно вывести список всех действующих объектов (которые никогда не были заменены) с перечислением их предшественников.
Это вроде как бы дерево, но наоборот, от листьев к стволу)) Нужно примерно такой вид получить
ОбъектПредшественникиOtherData
3NULL...
NULL2...
NULL1...
4NULL...
6NULL...
NULL5...
7NULL...
8NULL...
15 дек 11, 18:35    [11774084]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
Наверное, важно:
OtherData будет формироваться как сумма неких атрибутов кажого (в т.ч. заменённого) объекта в отдельности, т.е. будет ещё один join по id
15 дек 11, 18:39    [11774097]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
15 дек 11, 19:15    [11774282]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
Maxx
iap

я это читал, там нет решения. По крайней мере, я его не нашел.
15 дек 11, 19:19    [11774298]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
нарыл кое-что, похоже на мой вариант, но не уверен... голова уже плохо соображает...
надо выпить кофе...

http://msdn.microsoft.com/ru-ru/library/ms175156.aspx
15 дек 11, 19:20    [11774305]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
gandalf-the-grey
Maxx
iap

я это читал, там нет решения. По крайней мере, я его не нашел.


...решения чего ? конкретно вашей задачи - то да скорее всего нет, а вот CTE со всеми вытекающими помоему конкретно ражевано с примерами....
15 дек 11, 19:21    [11774308]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
Maxx
gandalf-the-grey
пропущено...

я это читал, там нет решения. По крайней мере, я его не нашел.


...решения чего ? конкретно вашей задачи - то да скорее всего нет, а вот CTE со всеми вытекающими помоему конкретно ражевано с примерами....


Это типа круто кинуть в ответ на вопрос ссылку, не имеющую к делу отношения? Я в стартовом посте ясно дал понять, что ЧИТАЛ ТЕМЫ о СТЕ, в т.ч. и по предложенной Вами ссылке. Спасибо, конечно...
Да, в той теме все хорошо разжевано, но к решению данной задачи отношения не имеет.

Похоже, кстати, я его нашел - чуть выше линк на МСДН, cross apply с СТЕ в теле табличной функции... Буду проверять...
15 дек 11, 19:28    [11774373]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
в общем, да:
;with cte(id, related_id, level)
as (
SELECT i.id, i.id related_id, 0 level
FROM @id i
left join @event e on e.related_id = i.id
where e.id is null
union all
select e.id, e.related_id, level + 1
from @event e
inner join cte on cte.related_id = e.id
where e.related_id is not null
)
select * from cte
возвращает то, что надо:
330
440
660
770
880
651
321
212
, осталось отсортировать... но совсем не хочется оформлять функцию, как по линку на МСДН... а вставить запрос вместо функции в cross apply из-за СТЕ не получается... Есть каки-то варианты?
15 дек 11, 19:56    [11774556]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
кажись придумал, утром отпишусь
15 дек 11, 20:06    [11774601]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с деревом через СТЕ  [new]
gandalf-the-grey
Member

Откуда: НН
Сообщений: 179
не, не вышло, помощь все ещё требуется... ((
15 дек 11, 21:00    [11774882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить