【问题标题】:postgres update value based on count of associated join tablepostgres 根据关联连接表的计数更新值
【发布时间】:2021-03-24 15:34:23
【问题描述】:

我有一个连接 TableA 和 TableB 的简单场景 TableA、TableB 和 JoinTable。我想在 TableA 中为 TableA 中的每一行存储 JoinTable 中具有 TableAId 的记录数。我可以正确选择如下:

SELECT "Id", (SELECT COUNT(*) FROM "JoinTable" WHERE "JoinTable"."TableAId" = "TableA"."Id") 
AS TOT FROM "TableA" LIMIT 100

但是,我很难编写更新查询。我想用这个结果更新 TableA.JoinCount。

【问题讨论】:

  • 与您的问题无关,但是:您应该真正避免使用那些可怕的带引号的标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…

标签: sql postgresql count sql-update subquery


【解决方案1】:

您可以使用相关子查询:

update tablea a
set tot = (
    select count(*)
    from jointable j
    where t.tableaid = a.id
)

这将使用来自jointable 的匹配计数更新tablea 的所有行;如果没有匹配项,则将tot 设置为0

但是,我不一定建议存储此类派生信息。虽然它可以很容易地用上面的语句初始化,但维护它是乏味的。您很快就会发现自己为连接表上的每个 DML 操作(更新、删除、插入)创建了触发器。相反,您可以将信息放在视图中:

create view viewa as
select id, 
    (select count(*) from jointable j where j.tableaid = a.id) as tot
from tablea a

旁注:一般来说,不要在 Postgres 中使用带引号的标识符。这个this link 了解更多。

【讨论】:

    【解决方案2】:

    您可以使用 group by 查询作为 UPDATE 语句的来源:

    update "TableA" a
      set "JoinCount" = t.cnt
    from (
      select "TableAId" as id, count(*) as cnt
      from "JoinTable" 
      group by "TableAId"
    ) t  
    WHERE t.id = a."Id"
    

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多