所以我过去只是写一些像
这样的东西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有不同的子查询规则可以更新?
另外如何进行实际更新?提前致谢
答案 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;
BEGIN
和ROLLBACK
是为了还原更改,只看到最新情况。
既然你说你的查询永远不会结束,你应该让它运行一两个小时,看看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))
我不测试它。如果您发布样本(使用创建表句子和插入,我们可以帮助您更好)。