web-dev-qa-db-fra.com

Fonction d'agrégation dans une requête de mise à jour SQL?

J'essaie de définir la valeur d'une table sur la somme des valeurs d'une autre table. Quelque chose dans ce sens:

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

Bien sûr, en l'état actuel des choses, cela ne fonctionnera pas - SET ne supporte pas SUM et il ne supporte pas GROUP BY.

Je devrais le savoir, mais mon esprit est vide. Qu'est-ce que je fais mal?

88
Margaret
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  
140
JBrooks

Utilisation:

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

Ou vous pouvez utiliser un mélange de JBrooks et OMG Ponies réponses:

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

Une bonne situation pour utiliser 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
Jonathan Roberts

Je sais que la question porte l'étiquette SQL Server, mais soyez prudent avec UPDATE avec JOIN si vous utilisez PostgreSQL . La réponse de @JBrooks ne fonctionnera pas:

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

Vous devrez l'adapter à:

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

Voir paramètre from_list dans la doc pour comprendre pourquoi FROM est considéré par PostgreSQL comme une auto-jointure: https://www.postgresql.org/docs/9.5/static/sql-update.html# AEN89239

2
Bludwarf