2010-01-05 7 views
74

J'essaye de placer la valeur dans une table à la somme des valeurs dans une autre table. Quelque chose le long de ces lignes:Fonction d'agrégation dans une requête de mise à jour SQL?

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

Bien sûr, car cela signifie, il ne fonctionne pas - SET ne supporte pas SUM et il ne supporte pas GROUP BY.

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

+0

+1 : Apprécié la mise à jour –

Répondre

118
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 
+36

J'ai mis les trois requêtes côte-à-côte et j'ai exécuté un plan d'exécution. Cette réponse avait un coût de 5%. – Margaret

+3

+1: Merci Margaret pour l'info –

+0

+1 C'est très utile. – gotqn

7

Utilisation:

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

J'ai mis les trois requêtes côte à côte et j'ai exécuté un plan d'exécution. Cette réponse a coûté 44%. – Margaret

5

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 
+13

J'ai mis les trois requêtes côte-à-côte et ai couru un plan d'exécution. Cette réponse avait un coût de 51%. – Margaret

+0

Okie dokie! Et merci pour les commentaires. Je vais l'ajouter à ma boîte à outils. :-) –

+2

+1: J'attendais de voir quel était le coût :) –

3

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