gpt4 book ai didi

sql-server-2008 - sql中的拓扑排序

转载 作者:行者123 更新时间:2023-12-04 07:21:06 30 4
gpt4 key购买 nike

我正在解决表中某些对象之间的依赖关系。
我必须对对象做一些事情,以便它们的依赖性。
例如,第一个对象不依赖于任何对象。第二个和第三个取决于第一个,依此类推。我必须使用 topological sorting .
有人可以展示实现的示例,以便在 t-sql 中进行排序。
我有一张 table :

create table dependency
(
DependencyId PK
,ObjectId
,ObjectName
,DependsOnObjectId
)

我想得到

对象标识
对象名称
排序

谢谢你。

最佳答案

它接缝,它的工作原理:

declare @step_no int

declare @dependency table
(
DependencyId int
,ObjectId int
,ObjectName varchar(100)
,DependsOnObjectId int
,[rank] int NULL
,degree int NULL
);

insert into @dependency values (5, 5, 'Obj 5', 2, NULL, NULL)
insert into @dependency values (6, 6, 'Obj 6', 7, NULL, NULL)
insert into @dependency values (2, 2, 'Obj 2', 1, NULL, NULL)
insert into @dependency values (3, 3, 'Obj 3', 1, NULL, NULL)
insert into @dependency values (1, 1, 'Obj 1', 1, NULL, NULL)
insert into @dependency values (4, 4, 'Obj 4', 2, NULL, NULL)
insert into @dependency values (7, 7, 'Obj 7', 2, NULL, NULL)


update @dependency set rank = 0
-- computing the degree of the nodes
update d set d.degree =
(
select count(*) from @dependency t
where t.DependsOnObjectId = d.ObjectId
and t.ObjectId <> t.DependsOnObjectId
)
from @dependency d


set @step_no = 1
while 1 = 1
begin
update @dependency set rank = @step_no where degree = 0

if (@@rowcount = 0) break
update @dependency set degree = NULL where rank = @step_no

update d set degree = (
select count(*) from @dependency t
where t.DependsOnObjectId = d.ObjectId and t.ObjectId != t.DependsOnObjectId
and t.ObjectId in (select tt.ObjectId from @dependency tt where tt.rank = 0))
from @dependency d
where d.degree is not null

set @step_no = @step_no + 1
end

select * from @dependency order by rank

关于sql-server-2008 - sql中的拓扑排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5417735/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com