SQL 最短路径
SQL Shortest Path
我有一个 table,它有一堆边,由 CREATE TABLE example ([FromId] INT, [ToId] INT);
制作(我必须使用这样的格式)。我试图找到给定“FromId”到“ToId”之间的最短路径(即我们试图从一个节点到另一个节点)。
我知道有一条最短路径,但我不确定如何在我的案例中使用它,因为我没有声明我的 table 一个 SQL 图。
抱歉,如果这是一个愚蠢的问题,我是 Whosebug 和 SQL 的新手。我正在使用 SQLite.
这是一个递归 CTE。这是一种方法:
with recursive cte as (
select f, t, 1 as lev, (f || '->' || t) as path
from edges
where f = 1
union all
select e.f, e.t, lev + 1 , (cte.path || '->' || e.t) as path
from cte join
edges e
on e.f = cte.t
where lev < 100 or e.t = 4
)
select cte.*
from cte
where cte.t = 4
order by lev
limit 1;
这将路径长度限制为 100(在大多数情况下是合理的最大值)以处理图表中的潜在循环。
Here 是一个 db<>fiddle.
我有一个 table,它有一堆边,由 CREATE TABLE example ([FromId] INT, [ToId] INT);
制作(我必须使用这样的格式)。我试图找到给定“FromId”到“ToId”之间的最短路径(即我们试图从一个节点到另一个节点)。
我知道有一条最短路径,但我不确定如何在我的案例中使用它,因为我没有声明我的 table 一个 SQL 图。
抱歉,如果这是一个愚蠢的问题,我是 Whosebug 和 SQL 的新手。我正在使用 SQLite.
这是一个递归 CTE。这是一种方法:
with recursive cte as (
select f, t, 1 as lev, (f || '->' || t) as path
from edges
where f = 1
union all
select e.f, e.t, lev + 1 , (cte.path || '->' || e.t) as path
from cte join
edges e
on e.f = cte.t
where lev < 100 or e.t = 4
)
select cte.*
from cte
where cte.t = 4
order by lev
limit 1;
这将路径长度限制为 100(在大多数情况下是合理的最大值)以处理图表中的潜在循环。
Here 是一个 db<>fiddle.