如何使用postgresql上另一个表中的行数更新字段?

时间:2018-06-06 17:19:53

标签: sql postgresql sql-update

所以我过去只是写一些像

这样的东西
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有不同的子查询规则可以更新?

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

2 个答案:

答案 0 :(得分: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 ... don'知道。

答案 1 :(得分:0)

尝试

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

我不测试它。如果您发布样本(使用创建表句子和插入,我们可以帮助您更好)。