[英]postgres update value based on count of associated join table
我有一个连接 TableA 和 TableB 的简单场景 TableA、TableB 和 JoinTable。 我想在 TableA 中为 TableA 中的每一行存储 JoinTable 中具有 TableAId 的记录数。 我可以正确 select 如下:
SELECT "Id", (SELECT COUNT(*) FROM "JoinTable" WHERE "JoinTable"."TableAId" = "TableA"."Id")
AS TOT FROM "TableA" LIMIT 100
但是我很难编写更新查询。 我想用这个结果更新 TableA.JoinCount。
您可以使用相关子查询:
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 中使用带引号的标识符。 这个这个链接更多。
您可以使用 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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.