Câu hỏi Hàm tổng hợp trong truy vấn cập nhật SQL?


Tôi đang cố gắng đặt giá trị trong một bảng thành tổng của các giá trị trong bảng khác. Một cái gì đó 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, như thế này là viết tắt, nó sẽ không hoạt động - SET không hỗ trợ SUM và nó không hỗ trợ GROUP BY.

Tôi nên biết điều này, nhưng tâm trí của tôi đang vẽ một khoảng trống. Tôi đang làm gì sai?


76
2018-01-05 23:25


gốc


+1: Đánh giá cao bản cập nhật - OMG Ponies


Các câu trả lời:


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  

124
2018-01-05 23:32



Tôi đặt ba truy vấn song song và chạy một kế hoạch thực hiện. Câu trả lời này có chi phí là 5%. - Margaret
+1: Cảm ơn Margaret vì thông tin - OMG Ponies
+1 Điều đó rất hữu ích. - gotqn
giải pháp tuyệt vời - danielea
Thanh lịch, dễ thực hiện ... Bạn đã ở đâu cả ngày ??? Tôi đã đập đầu của tôi trên nó trong hơn một giờ bây giờ :) - Ange1


Sử dụng:

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

8
2018-01-05 23:30



Tôi đặt ba truy vấn song song và chạy một kế hoạch thực hiện. Câu trả lời này có giá 44%. - Margaret


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

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

5
2018-01-05 23:37



Tôi đặt ba truy vấn song song và chạy một kế hoạch thực hiện. Câu trả lời này có chi phí là 51%. - Margaret
Okie dokie! Và cảm ơn vì phản hồi. Tôi sẽ thêm nó vào hộp công cụ của mình. :-) - Paulo Santos
1: Đã chờ đợi để xem chi phí là gì :) - OMG Ponies
Đó là vì bạn đang sử dụng một SUBQUERY phải kích hoạt SUM () mỗi hàng hợp lệ, ngay cả với trình tối ưu hóa - clifton_h


Một tình huống tốt để sử dụng 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

3
2017-08-14 23:44





Tôi biết câu hỏi được gắn thẻ SQL Server nhưng hãy cẩn thận với UPDATE với JOIN nếu bạn đang sử dụng PostgreSQL. Câu trả lời @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_list là tài liệu để hiểu tại sao FROM được PostgreSQL coi là tự tham gia: https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0
2018-04-25 16:38