powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с жёстким рекурсивным запросом))
5 сообщений из 5, страница 1 из 1
Помогите с жёстким рекурсивным запросом))
    #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
Помогите с жёстким рекурсивным запросом))
    #39732030
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

если уровня только 4, то и рекурсия не нужна.
А если сколько хочешь, то - динамически формировать запрос.
...
Рейтинг: 0 / 0
Помогите с жёстким рекурсивным запросом))
    #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
Помогите с жёстким рекурсивным запросом))
    #39732298
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
круто.
спасибо))
...
Рейтинг: 0 / 0
Помогите с жёстким рекурсивным запросом))
    #39732331
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Charles Weyland,

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


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