我们可以将一个递归查询的输出用于另一个递归查询吗?

时间:2017-05-19 18:27:37

标签: postgresql recursion graph-databases recursive-query topological-sort

我想找到DAG的拓扑类型。

create table topo(
v1 int,
v2 int
);

Insert into topo values (1,3),(2,5),(3,4),(4,5),(4,6),(5,7),(6,5),(7,null)

WITH RECURSIVE path(S,d) AS(
 select t1.v1, 0 from topo t1 left outer join topo as t2 on t1.v1=t2.v2 
 where t2.v2 IS null
 UNION ALL
 select distinct t1.v2, path.d + 1 from path inner join topo as t1 on 
 t1.v1=path.S
)
select S from path group by S order by MAX(d);

此代码提供图形拓扑顺序的输出。现在我想将此输出用于另一个递归查询,以查找从一个顶点到另一个顶点的路径。

我可以将此代码生成的输出用于另一个递归查询。我试图以正常方式这样做,但输出显示错误。

1 个答案:

答案 0 :(得分:1)

添加到现有的递归sql以获取路径:

WITH RECURSIVE path AS(
 select 
   t1.v1 as start,
   t1.v2 as end,  
   CAST(t1.v1 as VARCHAR(30)) as path 
   0 as depth
 from topo t1 
   left outer join topo as t2 on t1.v1=t2.v2 
 where t2.v2 IS null

 UNION ALL
 select 
   path.start ,
   t1.v2 as end,
   path.path || '>' || t1.v1,       
   path.d + 1 
 from path 
   inner join topo as t1 on t1.v1=path.end
)
SELECT * FROM path

只需添加几个字段即可跟踪遍历层次结构时发生的情况。 Start将在第一个查询中保持静态。每个记录都会1,因为这是您的起点。 End是您当前正在使用的任何节点。 path将在找到每个新节点时连接结束节点。 depth会告诉你你走了多远。