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

Mar*_*ret 91 sql t-sql sql-server

我正在尝试将一个表中的值设置为另一个表中的值的总和.这些方面的东西:

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3
Run Code Online (Sandbox Code Playgroud)

当然,正如这一点,它将无法工作 - SET不支持SUM,也不支持GROUP BY.

我应该知道这一点,但我的想法是空白的.我究竟做错了什么?

JBr*_*oks 143

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  
Run Code Online (Sandbox Code Playgroud)

  • 我把这三个查询并排放在一起并运行了一个执行计划.这个答案的成本为5%. (38认同)

OMG*_*ies 9

使用:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)
Run Code Online (Sandbox Code Playgroud)

  • 我把这三个查询并排放在一起并运行了一个执行计划.这个答案的成本为44%. (12认同)

Jon*_*rts 6

使用 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
Run Code Online (Sandbox Code Playgroud)


Pau*_*tos 5

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

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1
Run Code Online (Sandbox Code Playgroud)

  • 我把这三个查询并排放在一起并运行了一个执行计划.这个答案的成本为51%. (14认同)
  • +1:等着看成本是多少:) (2认同)