【发布时间】:2011-03-27 07:58:12
【问题描述】:
我不是特别习惯于生成复杂的 SQL 查询,并且很难将我对过程语言和基于集合的操作的理解混合在 为网络遍历设计递归查询。我希望通过对有向图进行深度优先搜索来找到位于特定节点“上游”的一组边(每个节点可以有多个上游边),并且最好在 SQL 中实现这一点。
我想要做的伪代码如下所示:
interesting_pipes = Pipes[]
func find_all_pipes_upstream(node n)
if is_inlet(nodename)
return Nil
else
for p in upstream_pipes:
if p in interesting_pipes:
return Nil
else
interesting_pipes.append(p)
find_all_pipes_upstream(upstream_node(p))
我已经用纯 SQL 编写了以下函数:
upstream_pipes(node_name varchar) RETURNS SETOF "Pipes"
upstream_node(pipe_name varchar) RETURNS "Node"
is_inlet(node_name) RETURNS boolean
但我正在努力弄清楚如何管理范围和返回类型
将上述伪代码转换为 PostgreSQL WITH RECURSIVE 查询或 PL/pgSQL 函数时。我见过的大多数WITH RECURSIVE 查询示例都是为遍历每个节点只有一个父节点的树而设计的。有没有人有任何提示/建议如何最好地解决这个问题?
干杯,
会
【问题讨论】:
标签: sql postgresql recursion plpgsql