Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找与SQL相关的路径(如Dijkstra)_Sql_Graph - Fatal编程技术网

查找与SQL相关的路径(如Dijkstra)

查找与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

我对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 
    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个左连接。