Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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 shift_job SET elapsed_time = ROUND(EXTRACT(EPOCH FROM actual_end_time - actual_start_time)/60): ALTER TABLE shift_worker ADD COLUMN actual_work_duration integer NULL; UPDATE shift_worker SET actual_work_durati

我在现有表中添加了一个字段,现在我必须更新旧条目以获得正确的值

UPDATE shift_job 
SET elapsed_time = ROUND(EXTRACT(EPOCH FROM actual_end_time - actual_start_time)/60):

ALTER TABLE shift_worker ADD COLUMN actual_work_duration integer NULL;
UPDATE shift_worker
SET actual_work_duration = SUM(SELECT elapsed_time
FROM shift_job 
WHERE shift_worker_id = shift_worker.id);
我计算了一份工作所用的时间,结果很好。在计算工人的实际工作时间时,我遇到了问题。我需要对所有“已用时间”字段求和,其中shift\u worker.id=shift\u job.shift\u worker\u id


我怎样才能做到这一点

您可以在派生表中进行聚合,并在UPDATE语句中连接到该表

UPDATE shift_worker
SET actual_work_duration = (SELECT SUM(elapsed_time)
FROM shift_job 
WHERE shift_worker_id = shift_worker.id);
UPDATE shift_worker
  SET actual_work_duration = t.total_time
FROM (
  select shift_worker_id, SUM(elapsed_time) as total_time
  FROM shift_job 
  group by shift_worker_id
) t
WHERE t.shift_worker_id = shift_worker.id;

这通常比使用关联子查询快得多。

您可以在派生表中进行聚合,并在UPDATE语句中连接到该表

UPDATE shift_worker
  SET actual_work_duration = t.total_time
FROM (
  select shift_worker_id, SUM(elapsed_time) as total_time
  FROM shift_job 
  group by shift_worker_id
) t
WHERE t.shift_worker_id = shift_worker.id;

这通常比使用相关子查询快得多。

。假设有合适的索引可用,您真的发现这比相关子查询更快吗?在许多数据库中,相关子查询会更快。(我假设所有或几乎所有行都将被更新。)@GordonLinoff:是的,因为所有行的聚合比为目标表中的每一行运行一个子选择要快。根据我的经验,差异高达4倍或更高5@a_horse_with_no_name . . . 大多数数据库倾向于对
分组使用排序算法,这意味着它们是O(n logn)。这意味着将聚合分解为更小的聚合通常更快。有趣的是,在Postgres(以及其他支持并使用基于散列的聚合的数据库)中,情况并非如此。我必须记住这一点。@GordonLinoff:我已经看到在Oracle中也会更快(使用MERGE,而不是使用具有相关子查询的更新)。假设有合适的索引可用,您真的发现这比相关子查询更快吗?在许多数据库中,相关子查询会更快。(我假设所有或几乎所有行都将被更新。)@GordonLinoff:是的,因为所有行的聚合比为目标表中的每一行运行一个子选择要快。根据我的经验,差异高达4倍或更高5@a_horse_with_no_name . . . 大多数数据库倾向于对
分组使用排序算法,这意味着它们是O(n logn)。这意味着将聚合分解为更小的聚合通常更快。有趣的是,在Postgres(以及其他支持并使用基于散列的聚合的数据库)中,情况并非如此。我必须记住这一点。@GordonLinoff:我已经看到在Oracle中也会更快(使用MERGE,而不是使用具有相关子查询的更新)