如何使用ST_Intersects更新postgis中的表

时间:2015-08-19 13:06:49

标签: postgresql postgis

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

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表中的所有行。 请帮助。

1 个答案:

答案 0 :(得分:4)

  • 您不必在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)
        );