如何使用ST_Intersects更新Postgis中的表

use*_*120 1 postgresql postgis

我在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'
Run Code Online (Sandbox Code Playgroud)

上面的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
Run Code Online (Sandbox Code Playgroud)

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

wil*_*ser 5

  • 您不必在FROM子句中指定目标表,因为它已经在范围表中
  • 您需要将目标表链接/关联到源表,我将您的ON()子句移到WHERE子句

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

由于您没有在源表中使用任何字段(并且多于一行可以满足intersects()),因此可以将src表移至exist()检查:


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