2011-01-27 32 views
8
UPDATE user 
SET balance = balance + p.amount 
FROM payments p WHERE user.id = p.user_id AND p.id IN (36,38,40) 

Nhưng nó làm tăng thêm sự cân bằng, chỉ có số tiền giá trị thanh toán đầu tiên năm 1936. Xin hãy giúp tôi làm thế nào để sửa chữa nó, tôi không muốn làm cho chu kỳ trong các mã để chạy rất nhiều yêu cầu.PostgreSQL CẬP NHẬT - truy vấn với trái tham gia vấn đề

Trả lời

19

Trong nhiều bảng UPDATE, mỗi hàng trong bảng mục tiêu chỉ được cập nhật một lần, ngay cả khi hàng được trả lại nhiều lần một lần.

Từ docs:

Khi một điều khoản FROM là hiện tại, những gì cơ bản xảy ra là bảng mục tiêu được gia nhập vào các bảng được đề cập trong fromlist, và mỗi hàng đầu ra của tham gia đại diện cho một hoạt động cập nhật cho bảng mục tiêu. Khi sử dụng FROM, bạn nên đảm bảo rằng phép nối tạo ra tối đa một hàng đầu ra cho mỗi hàng cần sửa đổi. Nói cách khác, một hàng mục tiêu không nên tham gia nhiều hơn một hàng từ các bảng khác. Nếu có, thì chỉ một trong các hàng nối sẽ được sử dụng để cập nhật hàng mục tiêu, nhưng hàng nào sẽ được sử dụng không dễ dự đoán trước được.

Sử dụng này để thay thế:

UPDATE user u 
SET  balance = balance + p.amount 
FROM (
     SELECT user_id, SUM(amount) AS amount 
     FROM payment 
     WHERE id IN (36, 38, 40) 
     GROUP BY 
       user_id 
     ) p 
WHERE u.id = p.user_id 
+0

'p' là undefined. –

+4

no - p là bí danh cho subselect, nó được xác định hoàn hảo. – Rob

Các vấn đề liên quan