查找与SQL相关的路径(如Dijkstra)
我对SQL非常陌生,所以我的问题是: 假设我们有一个表T,其中有a列和B列查找与SQL相关的路径(如Dijkstra),sql,graph,Sql,Graph,我对SQL非常陌生,所以我的问题是: 假设我们有一个表T,其中有a列和B列 A | B 1 | 2 2 | 3 4 | 6 3 | 5 3 | 8 7 | 8 现在在a和B之间有一条路径。我现在将它们称为节点。您可以从节点A到B,但不能从B到A,除非存在如下行: 1 | 2 2 | 1 但在我们的例子中,我们没有任何圆 我的目标是找到从1开始的路径的端点。 我使用递归查询,如: with rec (start, end) as ( (select A, B from T
A | B
1 | 2
2 | 3
4 | 6
3 | 5
3 | 8
7 | 8
现在在a和B之间有一条路径。我现在将它们称为节点。您可以从节点A到B,但不能从B到A,除非存在如下行:
1 | 2
2 | 1
但在我们的例子中,我们没有任何圆
我的目标是找到从1开始的路径的端点。
我使用递归查询,如:
with rec (start, end) as (
(select A, B
from T
where A = '1')
union all
( select A, B
from T, rec
where T.A = re.end
)
)
这导致rec输出(select*from rec
)如下所示:
1 | 2
2 | 3
3 | 5
3 | 8
我正在努力从这个输出中检索开始和结束
类smth
1 | 5,8
有人能帮忙吗?
如果我可以检索开始和结束,我就不需要递归,因为我只对这些节点感兴趣(不是路径)
//使用Sql Server 2017编辑,现在更准确,前提是不存在圆圈
with rec (root, start, [end]) as (
(select A root, A , B
from T
where A = '1')
union all
( select root, A, B
from T
join rec ON T.A = rec.[end]
)
)
select root A, string_agg([end], ',') B
from rec
where not exists (select 1 from T where T.A = rec.[end])
group by root;
当使用另一个DBMS使用不同的字符串聚合时,其余的都应按原样工作
我知道我的示例不准确,但我想你们可以理解这一点。递归是产品特有的功能。你的DBMS是什么?我使用的是“with…()”语句,但递归不是我的问题(我的DBMS肯定支持它)。我只需要一种方法来找到这条路的起点和终点,我想不出任何查询可以更新这个问题。提供基本数据,查询并准确描述问题所在。完成。正如我所说的,如果你能解决如何得到从X开始的路径的端点这一主要问题,那么递归是不必要的。也许如果它能让事情变得更容易,因为它会踢出所有不重要的行,我完全忘了我可以用一个属性来存储根:)你能想出没有递归的方法来解决这个问题吗(仅适用于表T和标准sql语句)?@通常,递归是不可避免的。如果树级别的数量严格小于N,则可以使用N个左连接。