Как обновить поле с количеством строк из другой таблицы на postgresql? - PullRequest
0 голосов
/ 06 июня 2018

Поэтому я просто писал что-то вроде

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 голосов
/ 07 июня 2018

Возможно, проблема в вашей базе данных.Как я уже сказал, у вашего первого запроса, похоже, нет проблем.Я могу заключить, что проблема не в запросе.

Возможно, WAL (вход в систему с предварительной записью) слишком велик, и вам нужно перезапустить сервер postgreSQL service (не просто перезапустить сервер, нослужбы также).

Возможно, вам нужно поработать над индексированием для ваших таблиц.

Вы можете запустить 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 ... не знаю.

0 голосов
/ 07 июня 2018

Попробуйте

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

Я не проверяю это.Если вы разместите образец (с предложением создания таблиц и вставками, мы можем помочь вам лучше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...