Fungsi agregat dalam kueri pembaruan SQL?

98

Saya mencoba mengatur nilai dalam satu tabel ke jumlah nilai di tabel lain. Sesuatu seperti ini:

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

Tentu saja, seperti ini, itu tidak akan berfungsi - SETtidak mendukung SUMdan tidak mendukung GROUP BY.

Aku harus tahu ini, tapi pikiranku mulai kosong. Apa yang saya lakukan salah?

Margaret
sumber
Pertanyaan bagus ... saya berharap saya bisa memberi suara positif lebih dari sekali.
Joe

Jawaban:

149
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  
JBrooks
sumber
41
Saya menempatkan tiga pertanyaan secara berdampingan dan menjalankan rencana eksekusi. Jawaban ini memiliki biaya 5%.
Margaret
Elegan, mudah diterapkan ... Kemana saja Anda sepanjang hari ??? Saya telah membenturkan kepala saya selama lebih dari satu jam sekarang :)
Ange1
1
Penting: Hati-hati jika salah satu bidang yang Anda kelompokkan mungkin nihil (mis. Bidang3 di atas). Anda harus mengubah 'bergabung' ke akun untuk ini atau jumlah Anda akan tidak akurat ( stackoverflow.com/a/14366034/16940 )
Simon_Weaver
10

Menggunakan:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)
OMG Ponies
sumber
14
Saya menempatkan tiga pertanyaan secara berdampingan dan menjalankan rencana eksekusi. Jawaban ini memiliki biaya 44%.
Margaret
ini tidak berhasil untuk saya, karena t2.filed3 adalah nama yang sama dengan table1.field2, jadi penggabungan yang dilakukan di belakang layar tidak berfungsi dengan baik. (Saya asumsikan ada yang bergabung di belakang layar)
Joe
5

Atau Anda bisa menggunakan campuran jawaban JBrooks dan OMG Pony :

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1
Paulo Santos
sumber
16
Saya menempatkan tiga pertanyaan secara berdampingan dan menjalankan rencana eksekusi. Jawaban ini memiliki biaya 51%.
Margaret
Oke! Dan terima kasih atas umpan baliknya. Saya akan menambahkannya ke kotak peralatan saya. :-)
Paulo Santos
Itu karena Anda menggunakan SUBQUERY yang harus mengaktifkan SUM () setiap baris yang valid, bahkan dengan pengoptimal
clifton_h
4

Situasi yang baik untuk menggunakan 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
Jonathan Roberts
sumber
3

Saya tahu pertanyaannya adalah SQL Server tetapi hati-hati dengan UPDATE dengan JOIN jika Anda menggunakan PostgreSQL . Jawaban @JBrooks tidak akan berfungsi:

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

Anda harus menyesuaikannya dengan:

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

Lihat parameter from_listdi dokumen untuk mengetahui mengapa FROMPostgreSQL dianggap sebagai self-join: https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239

Bludwarf
sumber
0

Anda juga bisa menggunakan CTE seperti di bawah ini.

;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
Karan
sumber