假设我有三个表:PostGIS的空间查询援助
- A.自治市(的MultiPolygon)
- B.邮编质心(点)
- C.用户数据(点)
来自(C)的条目将(B)中的条目与FK(代码)匹配。
我在寻找一种有效的方式来:用户数据(C)的在使用城市ST_Contains
计数数(A)。
BUT
这里是渔获:
如果C中的条目是NULL(或匹配的其它条件)使用,如果存在使用FK B中的匹配条目!! !
目前我已经尝试了各种图案,虽然空间查询& B和A &下,两个都是亚秒,有一次我在一个查询(目标)的结果是超过4secs添加它们放在一起
什么,我已经试过样品:
这是糟糕的(60+秒):
SELECT
A.*,
(SELECT FROM
(SELECT CASE WHEN C.GEOM IS NULL THEN B.GEOM ELSE C.GEOM END
FROM C LEFT JOIN B ON C.ID=B.ID) AS b
WHERE ST_CONTAINS(A.GEOM, b.GEOM)
) count
FROM
A
这是15秒:
SELECT
A.ID, ..., -- other A fields
COUNT(B.GEOM)
FROM
A,
(SELECT CASE WHEN C.GEOM IS NULL THEN B.GEOM ELSE C.GEOM END
FROM C LEFT JOIN B ON C.ID=B.ID) AS b
WHERE
ST_Contains(A.GEOM, b.GEOM)
GROUP BY
A.ID, ... -- other A fields
正如我所说
SELECT COUNT(*) FROM A LEFT JOIN B ON ST_Contains(A.GEOM, B.GEOM)
和
SELECT COUNT(*) FROM A LEFT JOIN C ON ST_Contains(A.GEOM, C.GEOM)
两个第二下返回英寸
各项指标到位外键以及(B.ID = C.ID)
感谢
我应该指出的是,第一个查询(60+秒)优于第二如果不需要CASE语句(即使用仅有B点) – George