我正在解决表中某些对象之间的依赖关系。 为了依赖它,我必须对对象做一些事情。 例如,第一个对象不依赖于任何对象。第二个和第三个取决于第一个,依此类推。我必须使用topological sorting。 有人可以显示实现的样本,所以在t-sql中排序。 我有一张桌子:
create table dependency
(
DependencyId PK
,ObjectId
,ObjectName
,DependsOnObjectId
)
我想要
的ObjectId 对象名 SortOrder的
谢谢。
答案 0 :(得分:4)
接缝,它有效:
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
答案 1 :(得分:1)
您有一个简单的树结构,每个ObjectId
只有一条路径,因此基于遍历的DependsOnObjectId
个链接的标记只提供一个答案,并且首先处理正确的内容的答案足够好。这很容易使用公用表表达式,并且具有易于移植的优点:
with dependency_levels as ( select ObjectId, ObjectName, 0 as links_traversed from dependency where DependsOnObjectId is null union all select ObjectId, ObjectName, links_traversed+1 from dependecy join dependency_levels on dependency.DependsOnObjectId = dependency_levels.ObjectId ) select ObjectId, ObjectName, links_traversed from dependency_levels order by links_traversed
答案 2 :(得分:0)
This article 通过拓扑排序和t-sql进行了示例。可以下载示例中使用的code。
修改强> 链接死了;这是一个存档版本:Using a Topological Sort to Create a Database Delete Script