【问题标题】: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。
【问题讨论】:
标签:
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"