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

Откуда:
Сообщений: 413
Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)   Mar 29 2009 10:11:52   
Copyright (c) 1988-2008 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.0 <X64>
 (Build 6002: Service Pack 2) 

Необходимо получить как-то с помощью CTE иерархически построенный путь к каждой записи. Не могу сообразить...

CREATE TABLE #t(Id int ,ParentId int, Code varchar(5), Name varchar(20))
Insert into #t values(1,null,'0','Книги')
Insert into #t values(2,1,'01','Программирование')
Insert into #t values(3,1,'02','Фантастика')
Insert into #t values(4,1,'03','Новеллы')
Insert into #t values(5,2,'001','Базы Данных')
Insert into #t values(6,2,'002','Java')
Insert into #t values(7,2,'003','C#')
Insert into #t values(8,5,'0001','MS SQL')
Insert into #t values(9,5,'0002','Oracle')
Insert into #t values(10,5,'0003','Interbase')

Select * from #t  
Drop table #t
Необходимо вывести ее в таком формате (сортировка не принципиальна):
Наименование Путь
Книги0
Программирование 0.01
Базы Данных0.01.001
MS SQL0.01.001.0001
Oracle0.01.001.0002
Interbase0.01.001.0003
Java01.01.002
C#01.01.003
20 окт 11, 15:57    [11473654]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
novise
Member

Откуда: Москва
Сообщений: 84
notricky,

Ну и что тут сложного?
declare  @t TABLE (Id int ,ParentId int, Code varchar(max), Name varchar(20))
Insert into @t values(1,null,'0','Книги')
Insert into @t values(2,1,'01','Программирование')
Insert into @t values(3,1,'02','Фантастика')
Insert into @t values(4,1,'03','Новеллы')
Insert into @t values(5,2,'001','Базы Данных')
Insert into @t values(6,2,'002','Java')
Insert into @t values(7,2,'003','C#')
Insert into @t values(8,5,'0001','MS SQL')
Insert into @t values(9,5,'0002','Oracle')
Insert into @t values(10,5,'0003','Interbase');

with cte (id, ParentId, Code, Name)
as
(
select id, ParentId, Code, Name from @t where ParentId is null
union all
select t1.id, t1.ParentId, t2.Code+'.'+t1.code, t1.Name from @t t1
join cte t2 on t2.id = t1.parentId
)
select * from cte
20 окт 11, 16:10    [11473760]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
notricky
Member

Откуда:
Сообщений: 413
такое вообще в CTE можно сделать?
20 окт 11, 16:10    [11473761]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
notricky
Member

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

Последний пост в топку, предпоследнему спасибо!

Не знаю, под конец рабочего дня головняк совсем не варит....
20 окт 11, 16:11    [11473768]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
notricky
Member

Откуда:
Сообщений: 413
Если Code varchar(10) - то пишет ошибку
[color=red]Types don't match between the anchor and the recursive part in column "short_name" of recursive query "q".[/color]

Если Code varchar(max) - то не пишет.
Как выйти из ситуации не меняя в исходной таблице размер Code varchar(10)?
20 окт 11, 16:37    [11473959]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
notricky
Member

Откуда:
Сообщений: 413
Сообщение 240, уровень 16, состояние 1, строка 13
Types don't match between the anchor and the recursive part in column "Code" of recursive query "cte".
20 окт 11, 16:38    [11473972]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
Каст вам в руки
Guest
notricky,

попробуйте преобразовать тип в запросе
20 окт 11, 16:41    [11474000]     Ответить | Цитировать Сообщить модератору
 Re: Выборка и построение иерархического пути для элемента дерева.  [new]
notricky
Member

Откуда:
Сообщений: 413
Каст вам в руки,
Спасибо.
20 окт 11, 17:40    [11474650]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить