更新postgresql中表的所有行

更新postgresql中表的所有行,sql,postgresql,Sql,Postgresql,我将表格的每一行与其他每一行进行比较,以找到最小距离。我还想添加两列,一列称为“最近的距离”,另一列称为“最近的距离”。 我知道我需要分两步来完成这项工作:第一步-更新第一行,第二步-基于第一行计算第二行。 我有一个查询,给出了最接近的距离,如下所示: SELECT DISTINCT ON (a.id) a.id, (SELECT MIN(ST_HausdorffDistance(a.the_geom, b.the_geom)) FROM gridareas A

我将表格的每一行与其他每一行进行比较,以找到最小距离。我还想添加两列,一列称为“最近的距离”,另一列称为“最近的距离”。 我知道我需要分两步来完成这项工作:第一步-更新第一行,第二步-基于第一行计算第二行。 我有一个查询,给出了最接近的距离,如下所示:

SELECT DISTINCT ON (a.id)
  a.id,
  (SELECT
     MIN(ST_HausdorffDistance(a.the_geom, b.the_geom))
   FROM
     gridareas AS b
   WHERE
     b.id != a.id
  )
FROM gridareas AS a; 
然而,我不能使用简单的

UPDATE tablename SET colname = expression;
并使用上面的查询作为表达式,因为

ERROR:  subquery must return only one column
LINE 5: (SELECT DISTINCT ON (a.id)
另一方面,子查询不能同时返回a.id和MINST_hausdorfdtance

我应该如何继续更新此专栏?

这是您想要的吗

update gridareas ga
    set (closest_id, closest_dist) =
            (select gs2.id, ST_HausdorffDistance(ga.the_geom, ga2.the_geom) as dist, ga2.id
             from gridareas ga2
             where ga2.id <> ga.id
             order by ST_HausdorffDistance(ga.the_geom, ga2.the_geom)
             limit 1
            );
这是你想要的吗

update gridareas ga
    set (closest_id, closest_dist) =
            (select gs2.id, ST_HausdorffDistance(ga.the_geom, ga2.the_geom) as dist, ga2.id
             from gridareas ga2
             where ga2.id <> ga.id
             order by ST_HausdorffDistance(ga.the_geom, ga2.the_geom)
             limit 1
            );

不完全是,但它帮了大忙,谢谢! 这就是解决我问题的方法:

UPDATE 
  gridareas AS a
SET 
  (hausdorffdistance_to_closest_geom) =
  (SELECT
     MIN(ST_HausdorffDistance(a.the_geom, b.the_geom))
   FROM
     gridareas AS b
   WHERE
     b.id != a.id
  );

不完全是,但它帮了大忙,谢谢! 这就是解决我问题的方法:

UPDATE 
  gridareas AS a
SET 
  (hausdorffdistance_to_closest_geom) =
  (SELECT
     MIN(ST_HausdorffDistance(a.the_geom, b.the_geom))
   FROM
     gridareas AS b
   WHERE
     b.id != a.id
  );

我认为一些示例数据会很有帮助。什么是id?id是表的主键!_geom是该区域的几何图形,因为这是一个postGIS,但它也与geom无关,它可以被任何int和ST_HausdorfDistance替换为任何其他函数,例如,LEASTI真的认为不应该将该信息保留在表列中。它是冗余的,因此会随着表的更改而腐烂。您应该使用动态计算信息的视图。如果这样一个视图的性能太慢(如果表很大,这似乎不太可能),请使用物化视图并定期刷新它。我认为一些示例数据会非常有用。什么是id?id是表的主键!_geom是该区域的几何图形,因为这是一个postGIS,但它也与geom无关,它可以被任何int和ST_HausdorfDistance替换为任何其他函数,例如,LEASTI真的认为不应该将该信息保留在表列中。它是冗余的,因此会随着表的更改而腐烂。您应该使用动态计算信息的视图。如果这样一个视图的性能太慢(如果表很大,这似乎不太可能),请使用物化视图并定期刷新它。