postgres:如何在递归中保存id?

时间:2014-06-11 10:04:58

标签: arrays postgresql recursion

当涉及到更复杂的SQL查询时,我是一个新手,所以请耐心等待。

我有一个街道网络。我的最终目标是“类”5的更新段,它们通过属于不同于5的类的下一段的类值相互接触。

想象一下:有12个细分市场。一个'情况'(读取高速公路出口情况)由6个部分组成。第一段是高速公路段,它有'2'级。以下4个段是退出段,它们具有类'5'。最后一段是本地道路,它有'4'级。所有退出段都需要更新为“2”类。第二种情况看起来很相似。

我设法通过运行此查询来识别所有转换段:

CREATE TABLE touch AS
SELECT s2.geom, s2.linkid, s2.class, s1.linkid AS linkid_sr FROM   
sr_buffer as s1, sr_buffer as s2
WHERE s1.class = 5 AND s2.class != 5 AND ST_EndPoint(s2.geom)=ST_StartPoint(s1.geom)  

但是,我需要识别位于过渡段之间的所有段。我想出了这个递归查询。

WITH RECURSIVE walk_network(linkid, class, geom, path) AS (
    SELECT linkid, class, geom, ARRAY[linkid] FROM test_exit WHERE class = 5
  UNION ALL
    SELECT n.linkid, n.class, n.geom, path || n.linkid
    FROM test_exit n, walk_network w
    WHERE ST_EndPoint(w.geom)=ST_StartPoint(n.geom) AND n.class = 5
)

SELECT *
FROM walk_network

我的想法是将属于一个'cluster'的所有linkid存储到一个数组中。但是查询只返回当前链接的数组而不是添加它们。我真的不明白为什么?

我想找出哪些出口段属于一起,因此加起来意味着将它们放入数组或表中。所以我可以在之后使用它们来查找它们所连接的最高级别。

3882600054  7   {3882600054}
3882600056  7   {3882600056}
3882600040  7   {3882600040}

如何在数组中存储一个递归循环的所有linkid?之后循环遍历数组以查找另一个表中的值的最佳方法是什么?

或者有没有办法更好地做到这一点?

0 个答案:

没有答案