powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Построение breadcrumbs
6 сообщений из 6, страница 1 из 1
Построение breadcrumbs
    #39991214
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть дерево (Таблица с полями 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
Построение breadcrumbs
    #39991217
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправленный скрипт
Код: 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
Построение breadcrumbs
    #39991225
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Построение breadcrumbs
    #39991232
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

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

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

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

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


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