假设我有三个表:
- A. 市政当局(MultiPolygon)
- B. 邮编质心(Point)
- C. 用户数据(Point)
(C) 中的条目将 (B) 上的条目与 FK(代码)匹配。
我正在寻找一种有效的方法来:
使用ST_Contains计算城市 (A) 中的用户数据 (C) 数量。
但
这是问题所在:
如果 C 中的条目为 NULL(或匹配另一个条件),则使用如果存在 B 中的匹配条目,则使用 FK !!!
目前我已经尝试了各种模式,虽然空间查询 A & B 和 A & C 都是亚秒级的,但一旦我将它们全部添加到一个查询(目标)中,结果就会超过 4 秒
我尝试过的示例:
这是更糟糕的(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)
谢谢