如何将多边形内点要素的平均步行时间写入Zones图层新字段?
解决Zones图层平均步行时间字段更新问题
嘿,我来帮你搞定这个更新语句的问题!你之前的UPDATE语句主要是缺少了子查询的闭合括号,而且还有更稳妥的写法来处理空间关联后的聚合更新,下面给你两种可行的方案:
方案1:修正子查询写法
先把你原来的语句补全,同时处理可能的空值情况(比如没有包含任何Address点的Zone):
UPDATE zones SET Avg_WalkTime = ISNULL( -- 子查询计算当前Zone包含的Address点的平均步行时间 (SELECT Avg(address.WalkTime) FROM address WHERE zones.Shape.STContains(address.Shape) = 1), 0 -- 如果没有匹配的Address点,设为0,也可以换成NULL保留空值 )
如果只想更新那些确实包含Address点的Zone,可以加上WHERE条件:
UPDATE zones SET Avg_WalkTime = ( SELECT Avg(address.WalkTime) FROM address WHERE zones.Shape.STContains(address.Shape) = 1 ) WHERE EXISTS ( SELECT 1 FROM address WHERE zones.Shape.STContains(address.Shape) = 1 )
方案2:使用UPDATE FROM关联聚合结果(更推荐)
这种方式先提前计算好每个Zone的平均步行时间,再关联到Zones图层更新,逻辑更清晰,也更容易排查问题:
UPDATE z SET z.Avg_WalkTime = ISNULL(agg.AverageWalkTime, 0) -- 关联Zones图层和提前聚合好的结果集 FROM zones z LEFT JOIN ( -- 先计算每个Zone的平均步行时间,和你最初的查询逻辑一致 SELECT zones.OBJECTID, Avg(address.WalkTime) AS AverageWalkTime FROM address JOIN zones ON zones.Shape.STContains(address.Shape) = 1 GROUP BY zones.OBJECTID ) agg ON z.OBJECTID = agg.OBJECTID
为什么你的原语句报错?
你写的语句最后缺少了闭合子查询的),导致语法不完整。另外,用子查询更新时,如果某个Zone没有匹配的Address点,子查询会返回NULL,直接更新的话会把Avg_WalkTime设为NULL,上面的方案用ISNULL可以避免这种情况,根据你的需求调整即可。
内容的提问来源于stack exchange,提问作者jakc
相关产品推荐
相关产品推荐

