当涉及到更复杂的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?之后循环遍历数组以查找另一个表中的值的最佳方法是什么?
或者有没有办法更好地做到这一点?