Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Построение breadcrumbs / 6 сообщений из 6, страница 1 из 1
20.08.2020, 19:52
    #39991214
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение breadcrumbs
Есть дерево (Таблица с полями Id, ParentId, Name)

DB script
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE [dbo].[Tree] (
	[Id] [int] NOT NULL ,
	[ParentId] [int] NULL,
	[Name] varchar(10) NULL,
) ON [PRIMARY]
GO

INSERT INTO Tree (Id, ParentId, Name) VALUES (0,NULL,'Root')
INSERT INTO Tree (Id, ParentId, Name) VALUES (1,1,'Child1')
INSERT INTO Tree (Id, ParentId, Name) VALUES (2,1,'Child2')
INSERT INTO Tree (Id, ParentId, Name) VALUES (12,1,'Child12')
INSERT INTO Tree (Id, ParentId, Name) VALUES (13,1,'Child13')
INSERT INTO Tree (Id, ParentId, Name) VALUES (14,1,'Child14')
INSERT INTO Tree (Id, ParentId, Name) VALUES (15,1,'Child15')
INSERT INTO Tree (Id, ParentId, Name) VALUES (22,2,'Child22')
INSERT INTO Tree (Id, ParentId, Name) VALUES (23,2,'Child23')
INSERT INTO Tree (Id, ParentId, Name) VALUES (24,2,'Child24')
INSERT INTO Tree (Id, ParentId, Name) VALUES (25,2,'Child25')
INSERT INTO Tree (Id, ParentId, Name) VALUES (121,12,'Child121')
INSERT INTO Tree (Id, ParentId, Name) VALUES (122,12,'Child122')
INSERT INTO Tree (Id, ParentId, Name) VALUES (1211,121,'Child1211')
INSERT INTO Tree (Id, ParentId, Name) VALUES (1212,121,'Child1212')



Как по заданному Id построить breadcrumbs?

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT Id, ParentId, Name, 1 Level FROM Tree where Id = 1211
 union 
SELECT Id, ParentId, Name, 2 FROM Tree where Id = (SELECT ParentId FROM Tree where Id = 1211)
 union 
SELECT Id, ParentId, Name, 3 FROM Tree where Id = (SELECT ParentId FROM Tree where Id = (SELECT ParentId FROM Tree where Id = 1211))
 union 
SELECT Id, ParentId, Name, 4 FROM Tree where Id = (SELECT ParentId FROM Tree where Id = (SELECT ParentId FROM Tree where Id = (SELECT ParentId FROM Tree where Id = 1211)))



неуниверсально и маловысокохудожественно.
...
Рейтинг: 0 / 0
20.08.2020, 20:04
    #39991217
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение breadcrumbs
Исправленный скрипт
Код: 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.
DROP TABLE [dbo].[Tree] 
GO 
CREATE TABLE [dbo].[Tree] (
	[Id] [int] NOT NULL ,
	[ParentId] [int] NULL,
	[Name] varchar(10) NULL,
) ON [PRIMARY]
GO

INSERT INTO Tree (Id, ParentId, Name) VALUES (0,NULL,'Root')
INSERT INTO Tree (Id, ParentId, Name) VALUES (1,0,'Child1')
INSERT INTO Tree (Id, ParentId, Name) VALUES (2,0,'Child2')
INSERT INTO Tree (Id, ParentId, Name) VALUES (12,1,'Child12')
INSERT INTO Tree (Id, ParentId, Name) VALUES (13,1,'Child13')
INSERT INTO Tree (Id, ParentId, Name) VALUES (14,1,'Child14')
INSERT INTO Tree (Id, ParentId, Name) VALUES (15,1,'Child15')
INSERT INTO Tree (Id, ParentId, Name) VALUES (22,2,'Child22')
INSERT INTO Tree (Id, ParentId, Name) VALUES (23,2,'Child23')
INSERT INTO Tree (Id, ParentId, Name) VALUES (24,2,'Child24')
INSERT INTO Tree (Id, ParentId, Name) VALUES (25,2,'Child25')
INSERT INTO Tree (Id, ParentId, Name) VALUES (121,12,'Child121')
INSERT INTO Tree (Id, ParentId, Name) VALUES (122,12,'Child122')
INSERT INTO Tree (Id, ParentId, Name) VALUES (1211,121,'Child1211')
INSERT INTO Tree (Id, ParentId, Name) VALUES (1212,121,'Child1212')

...
Рейтинг: 0 / 0
20.08.2020, 20:31
    #39991225
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение breadcrumbs
Victor Cookin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with cte as (
    select [id], [parentID], [Name], 1 as [lvl] from Tree where [Id] = 1211
    union all
    select t.[Id], t.[parentID], t.[Name], cte.[lvl] + 1 as [lvl]
    from cte
        join Tree t on t.[Id] = cte.[ParentID]
    where cte.[Id] <> cte.[ParentID]
)
select * from cte option (maxrecursion 0);
...
Рейтинг: 0 / 0
20.08.2020, 20:48
    #39991232
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение breadcrumbs
felix_ff,

красиво, спасибо.

А зачем тут
Код: sql
1.
    where cte.[Id] <> cte.[ParentID]

?
...
Рейтинг: 0 / 0
20.08.2020, 20:52
    #39991234
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение breadcrumbs
Victor Cookin,

это условие останавливает рекурсию.
закоментите его и запустите запрос - увидите что у вас данные когда дойдет до корневого элемента начнут бесконечно дублироваться из-за того что у вас корень смотрит сам на себя (id=1, parentid = 1)
...
Рейтинг: 0 / 0
20.08.2020, 22:07
    #39991253
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение breadcrumbs
felix_ff,
а, понятно. В общем случае хорошее условие. У меня родитель у корня - NULL, так что у меня бесконечности не будет
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Построение breadcrumbs / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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