首页 > 解决方案 > 从另一个表更新平均值/计数

问题描述

我已经为这个问题提供了以下架构,我正在尝试做两件事:

  1. 使用 POST_EVAL 表中每个 account_id 的评估行的平均值更新 ACCOUNT 表的 average_eval 行。
  2. 使用每个 account_id 的帖子数更新 ACCOUNT 表,如果 account_id 没有与之关联的 post_id,则默认值为 0。

这是踢球者:我必须使用该UPDATE语句,并且不允许对这些特定问题使用触发器。提供的架构

我试过WITH条款,GROUP BY但没有得到任何地方。使用 postresql 的 pgadmin 作为参考。

设置这些查询有什么帮助吗?

标签: sqlpostgresqlsql-update

解决方案


第一个问题可以用这样的方法来完成:

update account a
  set average_eval = t.avg_eval
from (
  select account_id, avg(evaluation) as avg_eval
  from post_eval 
  group by account_id
) t
where t.account_id = a.account_id

第二个问题需要一个共同相关的子查询,因为无法在 UPDATE 语句中表达外连接,如下所示:

update account a
  set num_posts = (select count(*)
                   from post p
                   where p.account_id = a.account_id);    

如果该帐户没有帖子,count()则将返回零 ( )。0如果使用了连接(如在第一条语句中),则根本不会更新行,因为“连接”条件不匹配。

我没有测试过这些语句中的任何一个,因此它们可能包含拼写错误(甚至是逻辑错误)。


无关,但是:我知道这是某种任务,所以你别无选择。但正如 RiggsFolly 所提到的:一般来说,您应该避免将信息存储在可以从现有数据派生的关系数据库中。这两个值都可以在视图中轻松计算,然后始终保持最新。


推荐阅读