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

Откуда: Москва
Сообщений: 170
Друзья, всем доброго времени!

Существует иерархия:

имякод
data101
data201.350
data301.350.10
data401.350.10.10
data501.350.10.10.001
data601.350.10.10.001.01

Очевидно, что "отцовское" подразделение разделяется путем ограничения точек.
Вопрос - как построить структуру типа:

имякод
data1data1
data2data1 / data2
data3data1 / data2 / data3
data4data1 / data2 / data3 / data4
data5data1 / data2 / data3 / data4 / data5
data6data1 / data2 / data3 / data4 / data5 / data6


В целом, я ухожу в запой, как начинаю думать о том, как зациклить скрипт так, чтобы параметр начала отсчета точки
charindex('.',t1.code,
был динамический)


Для обычных древовидных иерархий я пользуюсь этим алгоритмом
WITH tree (name, id, ParentId , level, code , cfu, pathstr) 
AS (SELECT t.NAME, t.ID, t.ParentId, 0, t.Code, t.cfu, CAST(t.Name AS VARCHAR (4000)) 
FROM dwh.dbo.BRANCH t 
WHERE t.ParentId is null

UNION ALL 

SELECT t.NAME, t.ID, t.ParentId, level + 1, t.code , t.cfu, CAST (tr.pathstr + ' / ' + t.name AS VARCHAR(4000)) 
FROM dwh.dbo.BRANCH t INNER JOIN tree tr ON (t.ParentId = tr.id))
select tr.name, tr.id, tr.ParentId , tr.level , tr.code, tr.cfu, tr.pathstr
From tree tr


Спасибо всем за ответы!
16 сен 16, 10:55    [19672273]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия из текстового значения  [new]
Добрый Э - Эх
Guest
fedoamx,

patindex?
16 сен 16, 11:04    [19672343]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия из текстового значения  [new]
iljy
Member

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

declare @t table (n varchar(100), c varchar(100))
insert @t values
('data1', '01'),
('data2', '01.350'),
('data3', '01.350.10'),
('data4', '01.350.10.10'),
('data5', '01.350.10.10.001'),
('data6', '01.350.10.10.001.01')

;with cte as
(
	select n, cast(n as varchar(max)) nFull, c from @t
	where c not like '%.%'
		union all
	select t.n, nFull + '/' + t.n, t.c
	from cte c join @t t on t.c like c.c + '.%' and RIGHT(t.c, case when len(t.c) > len(c.c) then len(t.c) - LEN(c.c)- 1 else 0 end) not like '%.%'
)
select * from cte
16 сен 16, 11:05    [19672350]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия из текстового значения  [new]
fedoamx
Member

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

СПАСИБО!
16 сен 16, 11:31    [19672544]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить