[英]Postgis/SQL Select tuples such that the first tuple item is unique and the items geometries intersect
这个问题特别针对Postgres 9.4
可以说我有两个表:
CREATE TABLE A(id INT);
CREATE TABLE B(id INT);
我想让所有元组(A,B)都具有一定的条件,以便所选元组中的所有元组都具有不同的A列:
SELECT DISTINCT ON (A.id) A.id, B.id WHERE condition(A,B);
但是, DISTINCT ON
将在选择所有元组之后在内存中执行排序,而我想完全不选择具有重复A.id的元组。
如何有效地做到这一点?
A和B都有唯一的ID
这是完整的设置:
CREATE EXTENSION postgis;
DROP TABLE A;
DROP TABLE B;
CREATE TABLE A(shape Geometry, id INT);
CREATE TABLE B(shape Geometry, id INT, kind INT);
CREATE INDEX ON A USING GIST (shape);`
我要执行以下操作:
SELECT A.id, B.id FROM A, B
WHERE B.id = (SELECT B.id FROM B WHERE
ST_Intersects(A.shape, B.shape)
AND ST_Length(ST_Intersection(A.shape, B.shape)) / ST_Length(A.shape) >= 0.5 AND B.kind != 1 LIMIT 1)`
(我认为)有效,但不一定是最有效的方法。 表A
比表B多了几个数量级。因此,我什至不确定GiST索引是否正确。
我也知道ST_Intersects中参数的顺序可能会对运行时产生重大影响。 正确的顺序应该是什么?
如果每个“ A”只需要一行,则可以使用相关的子查询(或横向联接):
select a.id,
(select b.id
from b
where condition(a, b)
limit 1
) as b_id
from a;
当找到第一个行时,这应该停止测试b
中的行-我认为这是性能最佳的方法。
如果找不到任何内容,则将获得NULL
值。 您可以将其包装在子查询中并过滤掉NULL
。
尝试类似:
WITH distinct_a as (
SELECT DISTINCT a.id
FROM A)
SELECT A.id, B.id
FROM distinct_a, B
WHERE condition(A,B)
CTE( WITH ...
)将首先选择所有不同的值。 然后,所选的值将用于下一个查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.