Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 将select查询合并到更新中_Sql_Postgresql_Subquery - Fatal编程技术网

Sql 将select查询合并到更新中

Sql 将select查询合并到更新中,sql,postgresql,subquery,Sql,Postgresql,Subquery,我有一张表格,上面有经过处理的数据,所以我不必在飞行中做这件事。但我必须经常更新表格。表开始变大(700行),更新记录需要相当长的时间 我目前有一组9个查询来更新表,我确信有一种方法可以在一个查询中实现,但我不知道: 以下是我到目前为止提出的问题: UPDATE checkouts SET total_colors = i.count_result, FROM (SELECT COUNT(*) AS count_result FROM "checkouts" WHERE class != 'g

我有一张表格,上面有经过处理的数据,所以我不必在飞行中做这件事。但我必须经常更新表格。表开始变大(700行),更新记录需要相当长的时间

我目前有一组9个查询来更新表,我确信有一种方法可以在一个查询中实现,但我不知道: 以下是我到目前为止提出的问题:

UPDATE checkouts SET total_colors = i.count_result,  FROM (SELECT COUNT(*) AS count_result FROM "checkouts" WHERE class != 'green' OR class is null) i WHERE i.id = checkouts.id
UPDATE checkouts SET sum_red = i.sum_result,  FROM (SELECT SUM("checkouts"."total_workers") AS sum_result FROM "checkouts" WHERE "checkouts"."class" = 'red') i WHERE i.id = checkouts.id
UPDATE checkouts SET sum_red = i.sum_result,  FROM (SELECT SUM("checkouts"."total_workers") AS sum_result FROM "checkouts" WHERE "checkouts"."class" = 'blue') i WHERE i.id = checkouts.id
UPDATE checkouts SET sum_red = i.sum_result,  FROM (SELECT SUM("checkouts"."total_workers") AS sum_result FROM "checkouts" WHERE "checkouts"."class" = 'yellow') i WHERE i.id = checkouts.id
UPDATE checkouts SET sum_red = i.sum_result,  FROM (SELECT SUM("checkouts"."total_workers") AS sum_result FROM "checkouts" WHERE "checkouts"."class" = 'black') i WHERE i.id = checkouts.id
UPDATE checkouts SET green_count = i.count_result,  FROM (SELECT COUNT(*) AS count_result FROM "checkouts" WHERE "checkouts"."company_id" = 113432 AND class = 'green') i WHERE i.id = checkouts.id
UPDATE checkouts SET code = i.code,  FROM (SELECT code FROM greens where code is not null GROUP BY code ORDER BY COUNT(code) DESC LIMIT 1) i WHERE i.company_id = checkouts.company_id
UPDATE checkouts SET code = i.email,  FROM (SELECT email FROM greens where email is not null GROUP BY email ORDER BY COUNT(email) DESC LIMIT 1) i WHERE i.company_id = checkouts.company_id
UPDATE checkouts SET total_workers = i.sum_result,  FROM (SELECT SUM("checkouts"."total_workers") AS sum_result FROM checkouts) i WHERE i.id = checkouts.company_id

您不应该在详细记录中存储摘要值(除非您确实知道自己在做什么)。一种可能性是在查询表格时进行计算:

SELECT c.*,
       SUM(CASE WHEN class <> 'green' OR class is null THEN 1 ELSE 0 END) OVER (PARTITION BY id),
       SUM(CASE WHEN class = 'red' THEN 1 ELSE 0 END) OVER (PARTITION BY id) as total_red,
       . . . 
FROM checkouts;
选择c*,
求和(当类“绿色”或类为空时,则为1,否则为0结束)超过(按id划分),
将(按id划分的)上的和(当类='red'然后1 ELSE 0 END时的情况)作为total_red,
. . . 
从退房;

事实上,您的数据结构看起来完全不正确。如果让我猜,您在
签出中有行项目详细信息,并且您正在尝试在中添加
订单级别
摘要。为此,您应该有多个表。这些通常被称为
订单
订单行

没有理由在每一行中存储总计。在读取表时,应该只获取值。