【发布时间】:2018-10-23 16:43:08
【问题描述】:
所以我有三个表(A、B、C)。在表 A 和 B 中,我有点,我想将 A 中的每一行插入到 C 中,以及从 B 到 A 中每个点的最近点的一些列,以及它们之间的距离。我知道获取最近邻居的查询是这样的:
SELECT DISTINCT ON (A.id5) A.state, B.way, st_distance (A.geom,B.geom) INTO C
FROM A, B
WHERE ST_DWithin(A.geom, B.geom, 150)
ORDER BY A.objectid, ST_Distance(A.geom,A.geom)
但我需要将其放入更大的 INSERT 查询中,并且我尝试这样做:
INSERT INTO complete(id_door, distance, id_way,Y, X, geom, check)
(SELECT A.state, (select distinct on (A.id5) ST_DISTANCE(A.geom,B.geom) from A order by A.id5, st_distance(A.geom,B.geom)), b.way, ST_Y(B.geom), ST_X(B.geom) ,B.geom, V.check
FROM A, B, C, V
WHERE
ST_INTERSECTS(A.geom, V.geom)\
AND ST_DWithin(A.geom, B.geom,150))
但这不是正确的方法,因为我得到了错误:
psycopg2.ProgrammingError: more than one row returned by a subquery used as an expression
我无法将所有距离从 A 和 B 复制到 C,然后删除除最近距离之外的所有距离,因为它是一个巨大的表,我会用完内存,所以我需要一种方法来只插入包含来自的信息的行从 B 到 A 的最近点。
我在这里做错了什么?提前谢谢你
更新:
经过一些帮助,我了解到我应该在 Select 查询中使用横向,但我不知道如何使用它。
我需要 Select 来获取表 A 中的每一行并从表 B 中找到它最近的邻居,我猜这是使用前面所述的查询完成的,然后将 A 中的一些列插入到表 C 中,从它最近的列中插入一些列邻居(表 B),以及表 V 中的一些列,这些列由相交条件选择。主要问题是如何将所有这些组织到 Select 中,这样我就不会出错。
这就是我现在所处的位置:
INSERT INTO C (id_door, distance, id_way,Y, X, geom, check)
(SELECT A.state, l.*, V.check
FROM A, B, C, V
lateral (select st_distance(a.geom,b.geom), b.way, ST_Y(B.geom), ST_X(B.geom) ,B.geom
From B
Where ST_DWithin(a.geom, b.geom,150))
Order by a.geom<->b.geom limit 1) l
WHERE
ST_INTERSECTS(A.geom, V.geom)
【问题讨论】:
-
第二个查询的V表是什么?
-
这只是我加入表格的一些附加信息,但与问题无关。
-
好的,如果您从 A 中的点与 V 表中的许多对象相交,您会期待什么结果?你想从 V 中只选择一条记录(你想在这样的过滤器上实现什么条件)还是你想插入所有与 A 相交的记录?!?
-
V 表由不重叠的多边形组成,因此每个点只能与 V 中的一个对象重叠。如果不是这种情况,我将只设置一个插入限制多边形。如果我在更新中写的查询是正确的(是吗?),我猜我只需要在与 B 的距离之后添加另一个横向,对吗?谢谢你,Grzegorz
-
查看最新版本的答案。我认为这可以满足您的需求。
标签: postgresql insert postgis