【问题标题】:How to update a table in postgis using ST_Intersects如何使用 ST_Intersects 更新 postgis 中的表
【发布时间】:2020-12-05 04:46:13
【问题描述】:

我在 postgis 中有一张两张桌子。一个是 Bank,它是点,另一个是 IndiaState,它是多边形。这两个表都有一个名为 State 的列。对于 Bank state 列是空的并且 IndiaState 表 state 列具有州名。我想使用 ST_Intersects 填充 Bank 表中的状态列。 我可以选择属于特定状态的银行积分

select ST_Intersection("IndiaState".geom, TN_Bank.geom) as inter
"Bank_Name", "Lat"
from "IndiaState" INNER JOIN TN_Bank ON ST_Intersects("IndiaState".geom, TN_Bank.geom)
where "IndiaState".state='KERALA'

上面的 sql 返回 66 行,这是正确的。

但是更新命令不能正常工作

update TN_Bank set "State"='KERALA' from 
(select ST_Intersection("IndiaState".geom, TN_Bank.geom) as inter
"Bank_Name", "Lat"
from "IndiaState" INNER JOIN TN_Bank ON ST_Intersects("IndiaState".geom, TN_Bank.geom)
where "IndiaState".state='KERALA')x

它正在更新 Bank 表中的所有行。 请帮忙。

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:
    • 您不必在 FROM 子句中指定目标表,它已经在范围表中
    • 您需要将目标表链接/关联到源表,我将您的 ON() 子句移至 WHERE 子句

    UPDATE TN_Bank dst
    SET "State" = 'KERALA' 
    FROM "IndiaState" src
    WHERE ST_Intersects(src.geom, dst.geom)
      AND src.state = 'KERALA'
            ;
    

    由于您没有使用源表中的任何字段(并且不止一行可以满足 intersects()),您可以将 src 表移动到 exists() 检查:


    UPDATE TN_Bank dst
    SET "State" = 'KERALA'
    WHERE EXISTS (
            SELECT *
            FROM "IndiaState" src
            WHERE src.state = 'KERALA'
              AND ST_Intersects(src.geom, dst.geom)
            );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多