Агрегатная функция в запросе на обновление SQL? - PullRequest
86 голосов
/ 06 января 2010

Я пытаюсь установить значение в одной таблице на сумму значений в другой таблице. Что-то вроде этого:

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.

Я должен знать это, но мой разум рисует пустое место. Что я делаю не так?

Ответы [ 5 ]

138 голосов
/ 06 января 2010
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  
9 голосов
/ 06 января 2010

Использование:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)
5 голосов
/ 06 января 2010

Или вы можете использовать смесь JBrooks и OMG Ponies ответы:

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1
3 голосов
/ 15 августа 2016

Хорошая ситуация для использования 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
2 голосов
/ 25 апреля 2018

Я знаю, что вопрос помечен SQL Server, но будьте осторожны с UPDATE с JOIN, если вы используете PostgreSQL . Ответ @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 как самостоятельное соединение: https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...