Postgres-将最近邻居的距离插入另一个表

时间:2018-10-22 12:07:59

标签: postgresql insert postgis

所以我有三个表(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)

1 个答案:

答案 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增加到所需的值。