我的PostgreSQL数据库触发器有问题。
我正在尝试使用PostGIS工具计算两个地理位置之间的距离。这两个点位于单独的表中,这两个表之间的KEY是site_id
列。
该sites
表结构为:
CREATE TABLE sites(
site_id INT,
site_name text,
latitude float ( 6 ),
longitude float ( 6 ),
geom geometry
);
该dots
表结构为:
CREATE TABLE dots(
dot_id INT,
site_id INT,
latitude float ( 6 ),
longitude float ( 6 ),
rsrp float ( 6 ),
dist INT,
project_id INT,
dist_from_site INT,
geom geometry,
dist_from_ref INT;
);
目标是创建一个触发器,在添加新的点时自动计算距离。
我创建的触发器是:
CREATE TRIGGER dots_insert_site_dist_trigger
AFTER UPDATE OF "geom"
ON "dots"
FOR EACH ROW
EXECUTE PROCEDURE dots_insert_site_dist_update();``
函数本身:
RETURNS trigger
AS
$$
BEGIN
UPDATE dots SET dist_from_site =
(SELECT ROUND(100*ST_Distance(NEW.geom, sites.geom))
FROM
dots,
sites
WHERE sites.site_id = NEW.site_id);
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
错误:
错误:由用作表达式的子查询返回的一行以上上下文:SQL语句“ UPDATE点SET dist_from_site =(SELECT ROUND(100 * ST_Distance(NEW.geom,sites.geom)))来自点,站点WHERE sites.site_id = NEW.site_id)“ PL / pgSQL函数dot_insert_site_dist_update()SQL语句的第3行
表格网站:
点表:
乍一看似乎您错过了子查询中的加入条件
SELECT ROUND(100*ST_Distance(NEW.geom, sites.geom))
FROM dots
INNER JOIN sites on dots site_id = sites.site_id
WHERE sites.site_id = NEW.site_id
并且这应该生成笛卡尔乘积(表之间的mxn行..并且建议您避免使用基于逗号分隔的表名称和where条件的旧联接语法,并使用带on子句的显式联接语法
您可以尝试使用查询作为更新的子查询
UPDATE dots
SET dist_from_site = t.my_dist
FROM (
SELECT dots.site_id, ROUND(100*ST_Distance(dots.geom, sites.geom)) my_dist
FROM dots
INNER JOIN sites on dots.site_id = sites.site_id
WHERE sites.site_id = dots.site_id
) t
WHERE dots.site_id = t.site_id
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句