最近我遇到了类似的问题,并尝试使用 SQL recursive CTE query 找到最长的路径。请参考给定的文章。
我尝试针对您的问题修改上述解决方案,并获取所有可能路径的列表,如以下输出屏幕所示
如果这是您想要达到的结果,我可以继续在 SQL Server 上描述我的解决方案
引用的 SQL 查询计算给定两个节点的最长路径。所以首先我们需要定义所有可能的起始节点和目标节点
下面的查询列出了所有可能集合的组合
select Nodes_From.Id as [From], Nodes_To.Id as [To]
from LongestPath_Nodes as Nodes_From
inner join LongestPath_Nodes as Nodes_To
on Nodes_From.Id <> Nodes_To.Id
请注意,这不包括“14”,例如,因为它不在节点表中(因此在给定的测试数据中实际上存在一致性问题)
因此,通过创建SQL 游标,我可以遍历每个节点集(从节点到节点的组合)并执行存储过程,其中包括 SQL 代码,计算参考文章中给定两个节点的最长路径
我还创建了一个表格来存储路径的总重量
Create Table LongestPath_Routes ([weight] decimal(10,1), path varchar(100))
如下面的 SQL 脚本所示,我一开始就清除了这个表。然后为存储过程中的每个从到节点集填充它最后在游标执行完成后,我通过根据权重列排序来查询表以获得最长路径(也可能是最短路径)
truncate table LongestPath_Routes
DECLARE @From TinyInt
DECLARE @To TinyInt
DECLARE PathCursor CURSOR FAST_FORWARD FOR
select Nodes_From.Id as [From], Nodes_To.Id as [To]
from LongestPath_Nodes as Nodes_From
inner join LongestPath_Nodes as Nodes_To
on Nodes_From.Id <> Nodes_To.Id
OPEN PathCursor
FETCH NEXT FROM PathCursor INTO @From, @To
WHILE @@FETCH_STATUS = 0
BEGIN
set nocount on
EXEC LongestPath_Calculate_for_Nodes @From, @To
set nocount off
FETCH NEXT FROM PathCursor INTO @From, @To
END
CLOSE PathCursor
DEALLOCATE PathCursor
select * from LongestPath_Routes order by [weight] desc
我希望这个解决方案可以帮助你