所以我有三个表(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查询中使用“横向”,但不确定如何使用。
我需要选择以获取表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)
答案 0 :(得分:1)
您可以使用横向联接-非常聪明的子查询类型,可以引用子查询之外的表。有关横向的更多信息,您可以找到here -根据答案中的新信息进行编辑-
Insert into C (id_door, distance, id_way,Y, X, geom, check)
select l.*
from a,
lateral (select a.state, st_distance(a.geom,b.geom),
b.way, ST_Y(B.geom), ST_X(B.geom), B.geom,
v.check
from b, v
where ST_DWithin(a.geom, b.geom,150)
and st_dwithin(a.geom,v.geom,0)
and st_intersects(a.geom,v.geom)
order by a.geom<->b.geom, v.geom limit 1) l
如果您希望A的每个点有更多记录,则将限制从1增加到所需的值。