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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Sql Server_Tsql - Fatal编程技术网

SQL更新查询中的聚合函数?

SQL更新查询中的聚合函数?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图将一个表中的值设置为另一个表中的值之和。大致如下: UPDATE table1 SET field1 = SUM(table2.field2) FROM table1 INNER JOIN table2 ON table1.field3 = table2.field3 GROUP BY table1.field3 当然,就目前情况而言,它不起作用-SET不支持SUM,也不支持groupby 我应该知道这一点,但我的脑子一片空白。我做错了什么?使用: UPDATE table1 SE

我试图将一个表中的值设置为另一个表中的值之和。大致如下:

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3
当然,就目前情况而言,它不起作用-
SET
不支持
SUM
,也不支持
groupby

我应该知道这一点,但我的脑子一片空白。我做错了什么?

使用:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)
或者,您可以混合使用以下选项和答案:


使用交叉应用的好情况

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

我知道这个问题被标记为SQL Server,但是如果您使用的是PostgreSQL,请小心使用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
,以了解PostgreSQL将
from
视为自连接的原因:

您也可以像下面这样使用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

我将这三个查询并排放置,并运行了一个执行计划。这个答案的成本是5%。优雅,易于实现…你一整天都在哪里???我已经在上面敲了一个多小时了:)重要提示:注意你分组的任何字段是否可以为空(如上面的field3)。您需要修改“join”来说明这一点,否则您的总和将不准确()这在postgresql中不起作用。你必须像这篇文章中那样做:我将三个查询并排放置,并运行一个执行计划。这个答案的代价是44%。这对我来说不起作用,因为t2.filed3与table1.field2同名,所以在幕后执行的连接不能正常工作。(我假设在幕后有一个连接)我将三个查询并排放置,并运行一个执行计划。这个答案花费了51%。好的!谢谢你的反馈。我将把它添加到工具箱中。:-)这可能是因为您使用的子查询必须在有效的每一行激发SUM(),即使使用OptimizerCreat问题。。。我希望我能不止一次投票。
UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3  
;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