Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с жёстким рекурсивным запросом)) / 5 сообщений из 5, страница 1 из 1
12.11.2018, 18:27
    #39731997
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с жёстким рекурсивным запросом))
В простом виде он выглядит так:
(данный запрос - самая типичная рекурсия)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with Tree(ID, level, v1, v2, v3, v4)
as
(

	select 1, ID, FullName, null, null, null
	from dict_Tree
	where Parent_ID=null
	union all
	select
		ID,
		Tree.level+1,
		FullName, null, null, null
	from dictTree
	inner join Tree on Tree.ID=dict_Tree.Parent_ID
)

SELECT *
  FROM Tree


Выведет список имён из дерева и его уровень вложенности.
id level v11 1 Директор2 2 Руководитель департамента Алёшин3 2 Руководитель департамента Родин4 3 Руководитель отдела Петров5 4 Хреновый программист
Но! нужен вывод вот такой:
id level v1v2v3v41 1 Директор null null null2 2 Директор Руководитель департамента Алёшин null null3 2 Директор Руководитель департамента Родин null null4 3 Директор Руководитель департамента Родин Руководитель отдела Петров null5 4 Директор Руководитель департамента Родин Руководитель отдела Петров Хреновый программист
...
Рейтинг: 0 / 0
12.11.2018, 19:23
    #39732030
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с жёстким рекурсивным запросом))
Charles Weyland,

если уровня только 4, то и рекурсия не нужна.
А если сколько хочешь, то - динамически формировать запрос.
...
Рейтинг: 0 / 0
13.11.2018, 09:52
    #39732195
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с жёстким рекурсивным запросом))
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
WITH dict_Tree (id,parent_id,FullName)
AS 
(
	SELECT 1,NULL,'Директор'
	UNION ALL
	SELECT 2,1,'Руководитель департамента Алёшин'
	UNION ALL
	SELECT 3,1,'Руководитель департамента Родин'
	UNION ALL
	SELECT 4,3,'Руководитель отдела Петров'
	UNION ALL
	SELECT 5,4,'Хреновый программист'

),
Tree(ID, level, c_path)
as
(

	select id, 1, cast(FullName + ';' AS VARCHAR(MAX))
	from dict_Tree
	where Parent_ID IS  null
	union all
	select
		tr.ID,
		t.level+1,
		t.c_path + tr.FullName + ';'
	from Tree t INNER  JOIN dict_Tree tr ON tr.parent_id = t.id
		
)
SELECT	t.ID, t.LEVEL,
		MAX(CASE WHEN t.N = 1 THEN t.c_value END) v1,
		MAX(CASE WHEN t.N = 2 THEN t.c_value END) v2,
		MAX(CASE WHEN t.N = 3 THEN t.c_value END) v3,
		MAX(CASE WHEN t.N = 4 THEN t.c_value END) v4
FROM (
		SELECT t.ID, t.LEVEL,t.c_path,value  AS c_value,row_number() OVER (PARTITION BY t.ID,t.level ORDER BY (SELECT 1)) N
		  FROM Tree t
			CROSS  APPLY STRING_SPLIT(t.c_path, ';') 
		) t 
WHERE t.c_value <> ''
GROUP BY t.ID, t.LEVEL		
...
Рейтинг: 0 / 0
13.11.2018, 11:22
    #39732298
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с жёстким рекурсивным запросом))
круто.
спасибо))
...
Рейтинг: 0 / 0
13.11.2018, 12:04
    #39732331
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с жёстким рекурсивным запросом))
Charles Weyland,

Самое интересное начнется когда c_path выйдет за границы VARCHAR(MAX). Тогда v1,v2,v3,v4 нужно будет определять с помощью рекурсии вверх.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с жёстким рекурсивным запросом)) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]