Hàm tổng hợp trong một truy vấn cập nhật SQL?


98

Tôi đang cố gắng đặt giá trị trong một bảng thành tổng các giá trị trong bảng khác. Vài điều dọc theo những dòng này:

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

Tất nhiên, vì điều này là đúng, nó sẽ không hoạt động - SETkhông hỗ trợ SUMvà nó không hỗ trợ GROUP BY.

Tôi nên biết điều này, nhưng tâm trí tôi trống rỗng. Tôi đang làm gì sai?


Câu hỏi tuyệt vời ... tôi ước tôi có thể ủng hộ nhiều hơn một lần.
Joe

Câu trả lời:


148
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  

40
Tôi đặt ba truy vấn cạnh nhau và chạy một kế hoạch thực thi. Câu trả lời này có chi phí là 5%.
Margaret

Thanh lịch, dễ thực hiện ... Bạn đã ở đâu cả ngày ??? Tôi đã đập đầu vào nó trong hơn một giờ bây giờ :)
Ange1

1
Quan trọng: Hãy để ý xem bất kỳ trường nào bạn đang nhóm lại có thể không có giá trị (ví dụ: trường 3 ở trên). bạn cần phải thay đổi 'tham gia' vào tài khoản này hoặc tiền của bạn sẽ không chính xác ( stackoverflow.com/a/14366034/16940 )
Simon_Weaver

10

Sử dụng:

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

14
Tôi đặt ba truy vấn cạnh nhau và chạy một kế hoạch thực thi. Câu trả lời này có chi phí là 44%.
Margaret

điều này không hiệu quả với tôi, vì t2.filed3 trùng tên với table1.field2, do đó, phép nối được thực hiện ở hậu trường không hoạt động bình thường. (Tôi cho rằng có sự tham gia ở hậu trường)
Joe

5

Hoặc bạn có thể sử dụng kết hợp các câu trả lời JBrooksOMG Ponies :

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

16
Tôi đặt ba truy vấn cạnh nhau và chạy một kế hoạch thực thi. Câu trả lời này có chi phí là 51%.
Margaret

Okie dokie! Và cảm ơn vì những phản hồi. Tôi sẽ thêm nó vào hộp công cụ của mình. :-)
Paulo Santos

Đó sẽ là bởi vì bạn đang sử dụng một subquery đó phải lửa ngoài khơi SUM () mỗi hàng đó là hợp lệ, ngay cả với tôi ưu hoa
clifton_h

4

Một tình huống tốt để sử dụng ÁP DỤNG CHÉO

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

Tôi biết câu hỏi được gắn thẻ SQL Server nhưng hãy cẩn thận với việc CẬP NHẬT với THAM GIA nếu bạn đang sử dụng PostgreSQL . Câu trả lời của @JBrooks sẽ không hoạt động:

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

Bạn sẽ phải điều chỉnh nó để:

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

Xem tham số from_listtrong tài liệu để biết tại sao FROMPostgreSQL được coi là tự tham gia: https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

Bạn cũng có thể sử dụng CTE như bên dưới.

;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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.