Bir SQL güncelleme sorgusunda toplama işlevi?


98

Bir tablodaki değeri başka bir tablodaki değerlerin toplamına ayarlamaya çalışıyorum. Bu satırlarda bir şey:

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

Elbette, bu haliyle işe yaramayacak - SETdesteklemiyor SUMve desteklemiyor GROUP BY.

Bunu bilmeliyim ama aklım boşa gidiyor. Neyi yanlış yapıyorum?


Harika soru ... keşke birden fazla oy verebilseydim.
Joe

Yanıtlar:


150
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  

41
Üç sorguyu yan yana koydum ve bir yürütme planı yaptım. Bu cevabın maliyeti% 5 idi.
Margaret

Zarif, uygulaması kolay ... Bütün gün neredeydiniz ??? Bir saatten fazla bir süredir kafamı beceriyorum :)
Ange1

1
Önemli: Gruplandırdığınız alanlardan herhangi birinin boş değer atanabilir olup olmadığına dikkat edin (örn. Yukarıdaki alan3). bunu hesaba katmak için 'birleştirme'yi değiştirmeniz gerekir, aksi takdirde toplamlarınız yanlış olur ( stackoverflow.com/a/14366034/16940 )
Simon_Weaver

10

Kullanım:

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

14
Üç sorguyu yan yana koydum ve bir yürütme planı yaptım. Bu cevabın maliyeti% 44'tür.
Margaret

bu benim için işe yaramadı, çünkü t2.filed3, table1.field2 ile aynı isimdi, bu yüzden perde arkasında gerçekleştirilen birleştirme düzgün çalışmadı. (Perde arkasında bir katılım olduğunu varsayıyorum)
Joe

5

Veya JBrooks ve OMG Ponies yanıtlarının bir karışımını kullanabilirsiniz :

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

16
Üç sorguyu yan yana koydum ve bir yürütme planı yaptım. Bu cevabın maliyeti% 51 idi.
Margaret

Okie dokie! Ve geri bildiriminiz için teşekkürler. Alet kutuma ekleyeceğim. :-)
Paulo Santos

Bunun nedeni, optimize
edici

4

CROSS APPLY kullanmak için iyi bir durum

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

Sorunun SQL Server olarak etiketlendiğini biliyorum, ancak PostgreSQL kullanıyorsanız UPDATE ile JOIN ile dikkatli olun . @JBrooks cevabı işe yaramayacak:

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

Aşağıdakilere uyarlamanız gerekecektir:

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

PostgreSQL tarafından from_listneden FROMkendi kendine birleştirme olarak değerlendirildiğini öğrenmek için belgedeki parametreye bakın : https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

CTE'yi aşağıdaki gibi de kullanabilirsiniz.

;WITH t2 AS (
    SELECT field3, SUM(field2) AS field2
    FROM table2
    GROUP BY field3
)
UPDATE table1
SET table1.field1 = t2.field2
FROM table1
INNER JOIN t2 ON table1.field3 = t2.field3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.