2010-01-05 12 views
74

Sto provando a impostare il valore in una tabella alla somma dei valori in un'altra tabella. Qualcosa in questo senso:Funzione di aggregazione in una query di aggiornamento SQL?

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

Naturalmente, come questo si distingue, non funzionerà - SET non supporta SUM e non sostenere GROUP BY.

Dovrei saperlo, ma la mia mente sta disegnando uno spazio vuoto. Che cosa sto facendo di sbagliato?

+0

+1 : Apprezzato l'aggiornamento –

risposta

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

Ho messo le tre query fianco a fianco e ho eseguito un piano di esecuzione. Questa risposta ha avuto un costo del 5%. – Margaret

+3

+1: Grazie Margaret per le informazioni –

+0

+1 È molto utile. – gotqn

7

Usa:

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

Ho messo le tre query fianco a fianco e ho eseguito un piano di esecuzione. Questa risposta ha avuto un costo del 44%. – Margaret

5

Oppure si potrebbe usare un mix di JBrooks e OMG Ponies risposte:

UPDATE table1 
    SET field1 = (SELECT SUM(field2) 
        FROM table2 AS t2 
        WHERE t2.field3 = t1.field3) 
    FROM table1 AS t1 
+13

Ho messo le tre domande fianco a fianco e ho eseguito un piano di esecuzione. Questa risposta ha avuto un costo del 51%. – Margaret

+0

Okie dokie! E grazie per il feedback. Lo aggiungerò alla mia cassetta degli attrezzi. :-) –

+2

+1: aspettavo di vedere quale fosse il costo :) –

3

Una buona situazione per utilizzare 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 
Problemi correlati