Sql 使用另一个表的聚合高效地更新表
我正在使用Sql 使用另一个表的聚合高效地更新表,sql,postgresql,Sql,Postgresql,我正在使用 UPDATE main SET val = ( SELECT SUM(..) FROM other WHERE main.id=other.main_id GROUP BY main_id ) 然而,other有可选的参与,所以当它运行时,当在另一个表中找不到它时,update似乎会将val清空。相反,它应该只更新子查询中存在的id的val 我该如何解决这个问题 编辑: 我设法通过添加 WHERE IN SELECT main_id FROM
UPDATE main
SET val = (
SELECT SUM(..)
FROM other
WHERE main.id=other.main_id
GROUP BY main_id
)
然而,other有可选的参与,所以当它运行时,当在另一个表中找不到它时,update似乎会将val清空。相反,它应该只更新子查询中存在的id的val
我该如何解决这个问题
编辑:
我设法通过添加
WHERE IN SELECT main_id FROM other
如果子查询返回null,则将val
设置为val
或者更好
update main
set val = s.val_sum
from (
select sum(..) as val_sum, main_id
from other
group by main_id
) s
where s.main_id = main.id
当我运行第二个查询时,planner选择散列主表(较大),然后执行散列联接。我认为从子查询散列表或者仅仅进行嵌套循环联接会更快。有没有一种方法可以在不影响配置的情况下实现这一点?
update main
set val = coalesce(
select sum(..)
from other
where main.id=other.main_id
group by main_id
), val)
update main
set val = s.val_sum
from (
select sum(..) as val_sum, main_id
from other
group by main_id
) s
where s.main_id = main.id