这是plpgsql的一个很好的候选者吗?

时间:2014-05-04 18:01:16

标签: postgresql plpgsql

我在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;

谢谢!

2 个答案:

答案 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子句。