我有两个表,其中表A
有一个包含曲面 (~20M) 的几何 (4326) 列。第二张表B
有 ~ 500K 点 (4326)。我想要做的是“标记”(添加一个布尔列)A
其中至少包含一个点的每个表面B
。
我这样做了:
CREATE TABLE foo_data AS
SELECT
A.*,
(SELECT EXISTS (SELECT ST_Contains(A.geom, B.geom) FROM B)) as flagged
FROM A;
但是我得到了所有“标记”值true
(这是不可能的)。
对于连接/横向,我并没有走得太远。
任何想法?
你很接近。我不会使用
EXISTS
,这实际上只对减少集合有用。我会去,CROSS JOIN LATERAL
然后coalesce
结果。看看这表现如何。a.geom
如果您在和上有空间索引b.geom
(并且您应该有针对此工作负载的索引),这应该对索引有效。这看起来也像是您只是为了提高性能而缓存结果。我建议在正常情况下 aMATERIALIZED VIEW
.或者你应该可以去,
问题是 ST_Contains 在任何情况下都会返回一个值(即如果空间关系为真/假)。相反,我会按如下方式编写查询:
或者: