我在plpgsql中使用for循环的一些介绍性教程已经说过,除非我真的需要一个for循环,我应该找到另一种方法。
作为编程新手,我无法找到比for循环更好的方法。
我想浏览每个parcel gid,通过边界框计算最近的街道交叉点,然后将交叉点id分配给parcels中的nearest_intersection列。
此功能的所有部分都能很好地工作。但我无法弄清楚如何将它们组合在一起。
BEGIN
FOR gid IN SELECT gid FROM parcels
LOOP
UPDATE parcels SET nearest_intersection =
(select intersection.osm_id
from intersections
order by
intersections.geom <-> (select geom from parcels where gid = parcel_id)
limit 1;)
end loop;
end;
谢谢!
答案 0 :(得分:2)
在当前的代码中,循环确实没有意义,因为仅UPDATE
已经处理parcels
表的每一行。
你可能想要的是(没有循环):
UPDATE parcels R SET nearest_intersection =
(select intersection.osm_id
from intersections
order by intersections.geom <-> R.geom
limit 1);
在程序思维方面相当于:
对于R
的每一行parcels
,,找到
intersections
中的行 其geom
最接近R.geom
并将其osm_id
复制到其中R.nearest_intersection
另一方面,如果必须使用循环,它将如下所示:
FOR var_gid IN SELECT gid FROM parcels
LOOP
UPDATE parcels SET nearest_intersection =
(select intersection.osm_id
from intersections
order by
intersections.geom <-> parcels.geom)
limit 1)
WHERE parcels.gid=var_gid;
end loop;
答案 1 :(得分:1)
不要成为SQL纯粹主义的人质。用循环写函数。当您是postgres专家时,您将其更改为查询。或者不是。
您可能错过了UPDATE的WHERE子句。