Недавно у меня была аналогичная проблема, и я пытался найдите самый длинный путь с помощью SQL-рекурсивного запроса CTE. Пожалуйста, обратитесь к данной статье.
Я попытался изменить указанное выше решение для вашей проблемы и получить список всех возможных путей, как показано на следующем экране вывода.
![введите описание изображения здесь](https://i.stack.imgur.com/KxE3N.png)
Если вы хотите добиться именно такого результата, я могу продолжить описание своего решения на 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
Надеюсь, это решение вам поможет
person
Eralper
schedule
30.03.2018