powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выделить path идущий от начала
3 сообщений из 3, страница 1 из 1
выделить path идущий от начала
    #39828554
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой набор иерархических данных. начальное значение имеет parentid = 0

Код: 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.
CREATE TABLE department
(
	id          int IDENTITY(1,1) NOT NULL PRIMARY KEY,
	name        nvarchar(255) NOT NULL,
	parentid    int NOT NULL,
    CONSTRAINT ux_department UNIQUE NONCLUSTERED (	name, parentid )
)
GO

CREATE NONCLUSTERED INDEX idx_department_idparent ON department ( parentid )
GO

INSERT INTO department (name, parentid) values ('root', 0)
INSERT INTO department (name, parentid) values ('child', (select id from department where name = 'root' and parentid = 0))
INSERT INTO department (name, parentid) values ('grandchild', (select id from department where name = 'child' and parentid = (select id from department where name = 'root' and parentid = 0)))

INSERT INTO department (name, parentid) values ('dad', 0)
INSERT INTO department (name, parentid) values ('son', (select id from department where name = 'dad' and parentid = 0))
INSERT INTO department (name, parentid) values ('grandson', (select id from department where name = 'son' and parentid = (select id from department where name = 'dad' and parentid = 0)))

INSERT INTO department (name, parentid) values ('father', 0)
INSERT INTO department (name, parentid) values ('son', (select id from department where name = 'father' and parentid = 0))
INSERT INTO department (name, parentid) values ('grandson', (select id from department where name = 'son' and parentid = (select id from department where name = 'father' and parentid = 0)))

INSERT INTO department (name, parentid) values ('grandfather', 0)
INSERT INTO department (name, parentid) values ('father', (select id from department where name = 'grandfather' and parentid = 0))
INSERT INTO department (name, parentid) values ('son', (select id from department where name = 'father' and parentid = (select id from department where name = 'grandfather' and parentid = 0)))
INSERT INTO department (name, parentid) values ('grandson', (select id from department where name = 'son' and parentid = (select id from department where name = 'father' and parentid = (select id from department where name = 'grandfather' and parentid = 0))))
GO



Можно ли найти пусть запросом от парсера?

Код: sql
1.
2.
3.
4.
;WITH cte AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) id, value FROM STRING_SPLIT('father\son\grandson', '\') x CROSS APPLY (SELECT id, name, parentid FROM department WHERE name = x.value)y
)SELECT * FROM cte JOIN department d ON cte.value = name




Или проще построить путь для каждого значения в таблице и сравнивать с эталоном?
...
Рейтинг: 0 / 0
выделить path идущий от начала
    #39828644
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.
WITH 
cte_src (path_el,N)
AS
(
	SELECT	VALUE,
			ROW_NUMBER() OVER (ORDER BY (SELECT 1))
	FROM string_split('father\son\grandson','\')
)
,cte_rec (id,[name],lvl)
AS
(
	SELECT  d.id,
			d.name,
			1
	FROM dbo.department AS d
		INNER JOIN cte_src AS cs
		 ON cs.N = 1
			AND cs.path_el = d.[name]
	WHERE d.parentid = 0
	
	UNION ALL
	
	SELECT  d.id,
			d.name,
			c.lvl + 1
	FROM cte_rec AS c
		INNER JOIN dbo.department AS d
			ON d.parentid = c.id
		INNER JOIN cte_src AS cs
			ON cs.N = c.lvl + 1
	WHERE d.[name] = cs.path_el			
)
SELECT *
FROM cte_rec
...
Рейтинг: 0 / 0
выделить path идущий от начала
    #39828852
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_Rivaldo,

Спасибо, так или иначе второй вариант.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выделить path идущий от начала
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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