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
'p' là undefined. –
no - p là bí danh cho subselect, nó được xác định hoàn hảo. – Rob