SQL Server - tại sao các chức năng cửa sổ không được phép trong các báo cáo cập nhật?


10

Khi chạy một câu lệnh cập nhật, chẳng hạn như câu lệnh dưới đây, tôi gặp lỗi khi nói với tôi rằng

Các hàm cửa sổ chỉ có thể xuất hiện trong các mệnh đề CHỌN hoặc ĐẶT HÀNG B BYNG mệnh đề.

UPDATE dbo.Dim_Chart_of_Account
SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey])

Tôi biết rằng điều này có thể dễ dàng làm việc xung quanh bằng cách sử dụng một cte có thể cập nhật, như dưới đây

 WITH my_cte AS (
     SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag
     FROM Dim_Chart_of_Account
)
UPDATE my_cte
SET [Account_Order] = acc_order_lag

Câu hỏi của tôi là, có bất kỳ lý do tại sao điều này không được phép trong một tuyên bố cập nhật, tôi có nên tránh sử dụng một cte cập nhật như một cách giải quyết không?

Mối quan tâm của tôi là có vấn đề khi sử dụng các chức năng của cửa sổ với các câu lệnh cập nhật và do đó tôi muốn hiểu liệu đây có phải là một phương pháp có thể chấp nhận hay nên tránh.


1
CTE cập nhật là chấp nhận được và tốt. Không biết tại sao nó không được phép trong CẬP NHẬT.
ypercubeᵀᴹ

2
Có lẽ Hallowe'en bảo vệ một số loại?
Aaron Bertrand

Câu trả lời:


5

Các chức năng của cửa sổ không được phép trong các câu lệnh CẬP NHẬT vì CẬP NHẬT không tương thích với CHỌN hoặc ĐẶT HÀNG B .NG.

Các hàm của cửa sổ giống như các câu lệnh CHỌN trong phạm vi kiểm tra lại các hàng có liên quan và áp dụng các điều kiện như THAM GIA B BYNG và ĐẶT HÀNG B .NG. Ngoài ra, nhiều hàm cửa sổ yêu cầu mệnh đề ORDER BY (ví dụ ROW_NUMBER, LAG và FIRST_VALUE).

Các câu lệnh CẬP NHẬT sử dụng SET thay vì CHỌN, vì vậy CHỌN không được phép ở bất kỳ đâu trong cùng một cấp truy vấn. Bất kỳ CHỌN nào xuất hiện cùng với CẬP NHẬT phải được chứa trong một truy vấn con.

Không cho phép ORDER BY có nghĩa là xem xét một câu lệnh CẬP NHẬT không khác biệt với thứ tự mà nó cập nhật các hàng.

Không có nhược điểm cố hữu khi sử dụng CTE hoặc truy vấn con khác như một cách giải quyết để có được CẬP NHẬT để sử dụng chức năng cửa sổ. Đó là cách làm phổ biến được ủng hộ bởi các chuyên gia T-SQL như Itzik Ben-Gan. (Xem trang 29 của cuốn sách của anh ấy, Microsoft SQL Server 2012 T-SQL hiệu suất cao bằng cách sử dụng các chức năng cửa sổ nơi anh ấy trình bày kịch bản chính xác này.)

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.