powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
2 сообщений из 52, страница 3 из 3
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
    #39835982
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222uaggsteraleks222, А где его взять, идентификатор то?
Для того, чтобы сгенерировать идентификатор, нужно определить все ноды, которые в него входят.
Ну, т.е. определить сам граф, в куче других.
Вот эти ноды - один граф, вот эти - другой.
А как это сделать?

Элементарно, Ватсон.
Код: 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 @graph table (parent bigint not NULL, child bigint not NULL, [weight] int not NULL, gID bigint, primary key(parent, child, [weight]), unique(child, parent, [weight]) );

insert into @graph(parent, child, [weight])
Values 
-- 1 граф
(1, 1, 1), (1, 2, 1), (1, 3, 10), (2, 3, 2), (3, 1, 3), (3, 6, 1), (6, 6, 2)
-- 2 граф
, (4, 4, 1), (4, 5, 1), (5, 4, 2), (5, 4, 1);

with t as ( select *, n = row_number() over( order by 1/0 ) from @graph )
  update t set gID = n from t;

declare @rc int = 1;

while @rc > 0 begin

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t.child = t1.parent
	   where t.gID > t1.gID 
  ;
  set @rc = @@ROWCOUNT;

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t1.child = t.parent
	   where t.gID > t1.gID 
  ;
  set @rc = @rc + @@ROWCOUNT;

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t1.child = t.child
	   where t.gID > t1.gID 
  ;
  set @rc = @rc + @@ROWCOUNT;

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t1.parent = t.parent
	   where t.gID > t1.gID 
  ;
  set @rc = @rc + @@ROWCOUNT;

end;

select * from @graph order by gID;

select gID, max([weight]) from @graph group by gID


Это получается пузырьковая сортировка что-ли?
Офигеть.
Понял. Наверное даже смогу воспроизвести с закрытыми глазами.

А почему
Код: sql
1.
with t as ( select * from @graph )

?
Просто:
Код: sql
1.
2.
3.
     update t set gID = t1.gID
	   from @graph t inner join @graph as t1 on t1.parent = t.parent
	   where t.gID > t1.gID 


Нельзя??
Нет, я понимаю, что можно, но может есть смысл какой-то, для табличных переменных или еще чего? В плане в упор никаких различий не нашел!
...
Рейтинг: 0 / 0
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
    #39836084
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterА почему
Код: sql
1.
with t as ( select * from @graph )

?

Это только личные предпочтения.
В остальном - пофиг.
...
Рейтинг: 0 / 0
2 сообщений из 52, страница 3 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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