bất cứ ai có thể cho tôi biết những gì kết quả như sau đây nên được theo tiêu chuẩn (một tham chiếu đến một phần đúng tiêu chuẩn sẽ được hoan nghênh)Tiêu chuẩn SQL nói gì về điều kiện "phụ thuộc" trong CẬP NHẬT?
> select * from t1;
+------+
| col1 |
+------+
| 9 |
| 8 |
| 10 |
+------+
> update t1
set col1 = col1 * 2
where col1 <= (select avg(col1) from t1);
Vấn đề là: Có hàng cuối cùng được cập nhật, vì nếu các hàng được cập nhật theo thứ tự và mức trung bình được tính toán lại cho mỗi hàng, nó sẽ đáp ứng điều kiện, hoặc nó không được cập nhật vì bất kỳ dữ liệu nào được thay đổi bởi câu lệnh này sẽ chỉ có thể đọc được sau khi toàn bộ câu lệnh được chạy?
EDIT Còn trường hợp này thì sao?
> select * from t1;
+------+------+
| col1 | col2 |
+------+------+
| 9 | 1 |
| 8 | 2 |
| 10 | 2 |
+------+------+
> update t1 p1
set col1 = col1 * 2
where col1 <= (select avg(col1)
from t1
where col2=p1.col2);
Tại đây truy vấn con được thực hiện trước tiên. Vì vậy, trung bình không thay đổi. –
@Shiplu Cảm ơn bạn. Và trường hợp thứ hai này, nơi truy vấn phụ không thể được thực hiện trước? – baruch
@baruch - Nó có thể được thực hiện trước trong đó một hoạt động đọc riêng biệt xác định các hàng được cập nhật và lưu trữ các định danh hàng trong một ống hoặc tương tự, sau đó cập nhật được thực hiện đọc từ ống chỉ sau khi đọc xong. Đó là kế hoạch tôi mong đợi trong SQL Server. Bạn không chắc chắn tôi có thể bị bẻ khóa thông qua các tiêu chuẩn SQL để tìm các bit có liên quan mặc dù. Một vài khái niệm liên quan là "tất cả - tại - một lần hoạt động" và bảo vệ halloween. –