SQL更新查询中的汇总函数?


98

我试图将一个表中的值设置为另一表中的值的总和。遵循以下原则:

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3

当然,按照目前的情况,它将不起作用- SET不支持SUM,也不支持GROUP BY

我应该知道这一点,但是我的脑海中一片空白。我究竟做错了什么?


很好的问题...我希望我可以不止一次投票。

Answers:


148
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
   from table2
  group by field3) as t2
on t2.field3 = t1.field3  

40
我将三个查询并排放置并执行了执行计划。该答案的成本为5%。
玛格丽特

优雅,易于实施...您整天都在哪里???我已经把头撞了一个多小时了:)
Ange1年

1
重要提示:请注意,您要分组的任何字段是否可以为空(例如,上面的field3)。你需要修改的“加入”为了解决这个问题或您的资金将是不准确的(stackoverflow.com/a/14366034/16940
Simon_Weaver

10

用:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)

14
我将三个查询并排放置并执行了执行计划。该答案的成本为44%。
玛格丽特

这对我不起作用,因为t2.filed3与table1.field2是相同的名称,因此在后台执行的联接无法正常工作。(我敢肯定幕后有幕)

5

或者您可以混合使用JBrooksOMG Ponies答案:

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1

16
我将三个查询并排放置并执行了执行计划。该答案的成本为51%。
玛格丽特

好的!并感谢您的反馈。我将其添加到我的工具箱中。:-)
Paulo Santos 2010年

那是因为您正在使用一个子查询,即使使用了优化程序,它也必须在有效的每一行都触发SUM()
clifton_h

4

使用CROSS APPLY的好情况

UPDATE t1
   SET t1.field1 = t2.field2Sum
  FROM table1 t1
 CROSS APPLY (SELECT SUM(field2) as field2Sum
                FROM table2 t2
               WHERE t2.field3 = t1.field3) AS t2

3

我知道问题被标记为SQL Server,但是如果您使用PostgreSQL,请谨慎使用UPDATE与JOIN 。@JBrooks答案无效:

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (...) as t2
on t2.field3 = t1.field3  

您必须将其调整为:

UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3  

请参阅from_list文档中的参数以获取为什么FROMPostgreSQL认为它是自连接的:https : //www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

您还可以如下使用CTE。

;WITH t2 AS (
    SELECT field3, SUM(field2) AS field2
    FROM table2
    GROUP BY field3
)
UPDATE table1
SET table1.field1 = t2.field2
FROM table1
INNER JOIN t2 ON table1.field3 = t2.field3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.