繁体   English   中英

Postgis / SQL选择元组,以便第一个元组项目是唯一的,并且项目几何形状相交

[英]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

EDIT2:

这是完整的设置:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM