Sql 将select查询合并到更新中
我有一张表格,上面有经过处理的数据,所以我不必在飞行中做这件事。但我必须经常更新表格。表开始变大(700行),更新记录需要相当长的时间 我目前有一组9个查询来更新表,我确信有一种方法可以在一个查询中实现,但我不知道: 以下是我到目前为止提出的问题: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
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,
. . .
从退房;
事实上,您的数据结构看起来完全不正确。如果让我猜,您在
签出中有行项目详细信息,并且您正在尝试在中添加订单级别
摘要。为此,您应该有多个表。这些通常被称为订单
和订单行
没有理由在每一行中存储总计。在读取表时,应该只获取值。