Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用另一个表的聚合高效地更新表_Sql_Postgresql - Fatal编程技术网

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