powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вывести уникальные вершины графа
11 сообщений из 11, страница 1 из 1
Вывести уникальные вершины графа
    #39780443
Fotoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется древовидная структура следующего вида

declare @tree_table (parent int, child int )
insert into @tree values(a1,a2)
insert into @tree values(a1,a3)
insert into @tree values(a1,a4)
insert into @tree values(a2,a5)
insert into @tree values(a2,a6)
insert into @tree values(a3,a7)
insert into @tree values(a5,a10)
insert into @tree values(a6,a11)
insert into @tree values(a4,a8)
insert into @tree values(a4,a9)
insert into @tree values(a8,a12)
insert into @tree values(a9,a13)
insert into @tree values(a9,a12)
insert into @tree values(a10,a14)
insert into @tree values(a10,a15)
insert into @tree values(a11,a16)
insert into @tree values(a11,a17)
insert into @tree values(a11,a18)
insert into @tree values(a12,a3)
insert into @tree values(a17,a15)
insert into @tree values(a18,a7)
insert into @tree values(a13,a19)
insert into @tree values(a14,a4)
insert into @tree values(a13,a4)

Задача вывести в столбик все уникальные значения для конкретной вершины. Т.е. для a1 - это все вершины
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780445
Fotoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
продолжение....

а для a17 только a15.

Что-то подобное я нашел в этой теме: https://www.sql.ru/forum/135312/zhutkiy-zapros , но не пойму как скорректировать на уникальные значения.

Буду благодарен за помощь.
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780454
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
WITH cte AS ( SELECT child FROM table WHERE parent = @starting_node
              UNION ALL
              SELECT table.child FROM table, cte WHERE table.parent = cte.child )
SELECT child FROM cte


?
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780458
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. Возможно, достаточно и UNION DISTINCT.
PPS. Лихо Вы в INT присваиваете непонятно что...
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780461
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Код: sql
1.
2.
3.
4.
WITH cte AS ( SELECT child FROM table WHERE parent = @starting_node
              UNION ALL
              SELECT table.child FROM table, cte WHERE table.parent = cte.child )
SELECT child FROM cte



?на "пути" а4 -а9-а13- а4 попадёт в бесконечную рекурсию

ТС же наврал про "древовидная структура" :)
(хотя в сабже, про граф, - сказал правду)
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780464
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtна "пути" а4 -а9-а13- а4 попадёт в бесконечную рекурсиюНе знаю, как именно к этому отнесётся MS SQL - а попробовать негде. Но UNION DISTINCT должен устранить эту проблему.
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780465
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во всяком случае postgresql и mysql с UNION DISTINCT точно дадут верный результат.
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780467
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это будут уникальные пути
Если убрать "*" и расскоментировать "/* distinct node */" - будут вершины достижимые из заданной

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
declare @tree table (parent varchar(5), child varchar(5))
insert into @tree values('a1','a2')
insert into @tree values('a1','a3')
insert into @tree values('a1','a4')
insert into @tree values('a2','a5')
insert into @tree values('a2','a6')
insert into @tree values('a3','a7')
insert into @tree values('a5','a10')
insert into @tree values('a6','a11')
insert into @tree values('a4','a8')
insert into @tree values('a4','a9')
insert into @tree values('a8','a12')
insert into @tree values('a9','a13')
insert into @tree values('a9','a12')
insert into @tree values('a10','a14')
insert into @tree values('a10','a15')
insert into @tree values('a11','a16')
insert into @tree values('a11','a17')
insert into @tree values('a11','a18')
insert into @tree values('a12','a3')
insert into @tree values('a17','a15')
insert into @tree values('a18','a7')
insert into @tree values('a13','a19')
insert into @tree values('a14','a4')
insert into @tree values('a13','a4')

declare @a varchar(5)='a1'

;with cte as (
	select 
		node	=child
		,[path]	=cast('/'+child+'/' as varchar(max))
	from @tree 
	where parent=@a

	union all

	select 
		node	=t.child
		,[path]	=cast(cte.[path]+t.child+'/' as varchar(max))
	from @tree t inner join cte on t.parent=cte.node
	where cte.[path] not like '%/'+t.child+'/%'
)

select 
	* 
	/* distinct node */
from cte  
order by 1



nodepatha10/a2/a5/a10/a11/a2/a6/a11/a12/a4/a8/a12/a12/a4/a9/a12/a12/a2/a5/a10/a14/a4/a9/a12/a12/a2/a5/a10/a14/a4/a8/a12/a13/a2/a5/a10/a14/a4/a9/a13/a13/a4/a9/a13/a14/a2/a5/a10/a14/a15/a2/a5/a10/a15/a15/a2/a6/a11/a17/a15/a16/a2/a6/a11/a16/a17/a2/a6/a11/a17/a18/a2/a6/a11/a18/a19/a4/a9/a13/a19/a19/a2/a5/a10/a14/a4/a9/a13/a19/a2/a2/a3/a3/a3/a4/a9/a12/a3/a3/a4/a8/a12/a3/a3/a2/a5/a10/a14/a4/a8/a12/a3/a3/a2/a5/a10/a14/a4/a9/a12/a3/a4/a2/a5/a10/a14/a4/a4/a4/a5/a2/a5/a6/a2/a6/a7/a2/a5/a10/a14/a4/a9/a12/a3/a7/a7/a2/a5/a10/a14/a4/a8/a12/a3/a7/a7/a4/a9/a12/a3/a7/a7/a4/a8/a12/a3/a7/a7/a3/a7/a7/a2/a6/a11/a18/a7/a8/a4/a8/a8/a2/a5/a10/a14/a4/a8/a9/a2/a5/a10/a14/a4/a9/a9/a4/a9/
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780504
Fotoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Огромное спасибо.

С int перегнул конечно )
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780505
Fotoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtAkina
Код: sql
1.
2.
3.
4.
WITH cte AS ( SELECT child FROM table WHERE parent = @starting_node
              UNION ALL
              SELECT table.child FROM table, cte WHERE table.parent = cte.child )
SELECT child FROM cte



?на "пути" а4 -а9-а13- а4 попадёт в бесконечную рекурсию

ТС же наврал про "древовидная структура" :)
(хотя в сабже, про граф, - сказал правду)

Пробую по результатам отпишусь.
...
Рейтинг: 0 / 0
Вывести уникальные вершины графа
    #39780507
Fotoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

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


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