我有两张表,表1包含一个正方形/网格,表2包含行政区域的多边形.我使用ST_Intersects()函数用表2中的数据更新表1.以下是我的查询的一个示例:

update table_grid 
set data1 = table_administrative.data1 
from table_administrative 
where ST_Intersects(table_grid.geom, table_administrative.geom)

查询将如何运行?如果网格在两个或多个行政区域内具有交叉点,情况又会如何呢?它是随机 Select 的,还是最大的区域,还是根据质心 Select 的?

这种情况的一个例子如图所示

example grid that intersect two areas

推荐答案

在两个或多个行政区域内有交点的格网怎么办?它是随机 Select 的,还是最大的区域,还是根据质心 Select 的?

随机地,由于update..from的工作方式:

使用FROM时,您应该确保联接最多为要修改的每一行生成一个输出行.换句话说,一个目标行不应该连接到另一个表(S)中的多行.如果是这样,那么只有一个联接行将用于更新目标行,但不能很容易地预测将使用哪一个.

即使您看到它最终使用的那些代码具有一定的可重复性,它也是不可靠的.也就是说,你可以纠正你的查询,根据你自己的标准,比如质心、重叠区域的接近程度,或者按字母顺序 Select the one with lower/earlier id个,明确地 Select 你想要的那个.

添加子查询distinct onorder by..limit 1row_number()over().<<->>bbox质心距离运算符可能很有用:demo

with cte as (select distinct on (tg.ctid) tg.ctid, data1
             from table_grid tg 
             join table_administrative ta
               on ST_Intersects(tg.geom,ta.geom)
             order by tg.ctid, tg.geom <<->> st_centroid)
update table_grid as this
set data1 = cte.data1
from cte
where this.ctid=cte.ctid

你可能也会对ST_Subdivide()个感兴趣.如果你用它来细分行政区域,所有这些join(以及你的update隐含地加入)将会快得多.为了提高性能,将ST_Intersects()降级到普通边界框交叉点&&也会更安全一些,以防您计划坚持"直接"更新,而不是考虑随机解析的纽带:

update __test.table_grid 
set data1 = table_administrative.data1 
from __test.table_administrative
where table_grid.geom && table_administrative.geom;

Sql相关问答推荐

SQL(PostgreSQL)从条件创建点表

为什么postgres中CURRENT_TIMESTAMP的日期与CURRENT_DATE不同?

如何更新SQLite数据库中的表?

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

通过之前的连接-这是Oracle的错误吗?

每年独特口味的冰淇淋数量

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

在Postgres中合并相似的表

具有多个条件的SQL否定

数据库SQL PARSE_SYNTAX_ERROR

组合2个分区表的postgres视图的执行计划正在访问所有分区

使用与JOIN一起使用的查询后进行分页和排序

如何修复初学者 SQL INNER JOIN 查询错误

删除对 JSON 数据的未解析引用的 SQL71502 警告

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

使用长 IN 子句的 SQL 优化

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

CURRENT_ROW 窗口框架上的 SQL 滞后

PostgreSQL Select 具有两列的自引用

如何使用子查询锁定此查询中的选定行?