Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вывести уникальные вершины графа / 11 сообщений из 11, страница 1 из 1
28.02.2019, 15:17
    #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
28.02.2019, 15:20
    #39780445
Fotoview
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести уникальные вершины графа
продолжение....

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

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

Буду благодарен за помощь.
...
Рейтинг: 0 / 0
28.02.2019, 15:28
    #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
28.02.2019, 15:30
    #39780458
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести уникальные вершины графа
PS. Возможно, достаточно и UNION DISTINCT.
PPS. Лихо Вы в INT присваиваете непонятно что...
...
Рейтинг: 0 / 0
28.02.2019, 15:32
    #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
28.02.2019, 15:36
    #39780464
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести уникальные вершины графа
courtна "пути" а4 -а9-а13- а4 попадёт в бесконечную рекурсиюНе знаю, как именно к этому отнесётся MS SQL - а попробовать негде. Но UNION DISTINCT должен устранить эту проблему.
...
Рейтинг: 0 / 0
28.02.2019, 15:37
    #39780465
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести уникальные вершины графа
Во всяком случае postgresql и mysql с UNION DISTINCT точно дадут верный результат.
...
Рейтинг: 0 / 0
28.02.2019, 15:37
    #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
28.02.2019, 16:45
    #39780504
Fotoview
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести уникальные вершины графа
Akina,

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

С int перегнул конечно )
...
Рейтинг: 0 / 0
28.02.2019, 16:46
    #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
28.02.2019, 16:48
    #39780507
Fotoview
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести уникальные вершины графа
court,

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


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