【问题标题】:How to update a field with a count of rows from another table on postgresql?如何使用 postgresql 上另一个表的行数更新字段?
【发布时间】:2026-01-04 21:20:02
【问题描述】:

所以我以前只是简单地写一些类似的东西

update tableA a
set columnA = (select sum(column_that_I_need_to_count) from tableB b where st_contains(a.geom, b.geom)

但由于某种原因,这样的更新不适用于我的新数据库。它只是无限期地运行更新并且永远不会完成

现在我必须把它写成

 update tableA a
 set columnA = count(column_that_I_need_to_count) 
 from tableB b where st_contains(b.geom, a.geom)

问题是它说它不允许更新计数

创建表语句是:

create tableA (
id integer,
name text,
geom geometry(polygon, 27700) 
)

create tableB(
fid bigint,
column_that_I_need_to_count integer,
name text,
geom geometry(point, 27700)
)

不同的postgresql有不同的更新子查询规则有什么原因吗?

另外如何进行实际更新?提前致谢

【问题讨论】:

  • 您能否将您的真实查询与数据示例结合起来?第一个查询是OK,它应该可以工作。第二个查询是WRONG,你不能这样使用count(*)。有很多方法可以进行这种更新。但是由于第一个查询不起作用,可能是您的数据库结构或数据存在问题。
  • @Dan 第一个查询是过去一年我是如何进行所有更新的,但现在它在这个新数据库上不起作用,它运行它但永远不会完成。第二个不像你说的那样工作,我只是想知道如何在这个新数据库上工作
  • 如果它运行并且从未完成,很可能是您的数据库存在问题。反正我是根据你的信息回答的。

标签: sql postgresql sql-update


【解决方案1】:

您的数据库可能有问题。就像我说的你的第一个查询似乎没有问题。我可以得出结论,问题不在于查询。

可能 WAL(预写登录)太大,您需要重新启动 postgreSQL 服务器服务(不仅要重新启动服务器,还要重新启动服务)。

也许您需要为您的表建立一些索引。

您可以运行EXPLAIN ANALYZE 看看可能出了什么问题。

BEGIN;
EXPLAIN ANALYZE UPDATE tableA a set columnA = (SELECT SUM(column_that_I_need_to_count) FROM tableB b WHERE st_contains(a.geom, b.geom)
ROLLBACK;

BEGINROLLBACK 是为了让它恢复更改并看看发生了什么。

既然你说你的查询永远不会结束,你应该让它运行一两个小时,看看EXPLAIN ANALYZE 说什么,如果它继续运行......好吧......你的数据库肯定有问题。

除此之外,您的SUM 可能需要GROUP BY,因为如果不需要,它将为所有行设置相同的值。

第二次尝试。正确的做法是:

WITH counted AS(
  SELECT a.id as id_counted,SUM(b.column_that_I_need_to_count) AS counted_rows
  FROM tableA a, tableB b
  WHERE st_contains(a.geom, b.geom) GROUP BY a.id
)UPDATE tableA
SET columnA = counted_rows
FROM counted
WHERE id = id_counted;

最后,就像@Emilio Platzer 所说,如果你需要数数,而不是SUM,你应该使用COUNT...但也许你需要SUM...不知道。

【讨论】:

  • 我会像你刚刚给我的那样尝试'with',否则我将不得不与系统管理员核实。
【解决方案2】:

试试

update tableA a
  set columnA = (select count(*) from tableB b where st_contains(b.geom, a.geom))

我不测试它。如果您发布示例(使用创建表格语句和插入内容,我们可以为您提供更好的帮助)。

【讨论】:

  • 嗯,您只是复制粘贴了我的查询,还是阅读了我的第一个问题?但我肯定会添加创建表语句
最近更新 更多