Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выделить path идущий от начала / 3 сообщений из 3, страница 1 из 1
19.06.2019, 19:50
    #39828554
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выделить path идущий от начала
Есть такой набор иерархических данных. начальное значение имеет 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
20.06.2019, 08:34
    #39828644
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выделить path идущий от начала
Код: 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
20.06.2019, 16:04
    #39828852
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выделить path идущий от начала
Cristiano_Rivaldo,

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


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