SQL Server - чому функції вікон не дозволяються в операторах оновлення?


10

Під час запуску оператора оновлення, наприклад, наведеного нижче, я отримую помилку про це

Віконні функції можуть відображатися лише в пунктах SELECT або ORDER BY.

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

Я знаю, що це можна легко вирішити, використовуючи оновлений cte, як нижче

 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

Моє запитання: чи є якісь причини, чому це не дозволено в операторі оновлення, я повинен уникати використання оновленого cte в якості вирішення?

Мене хвилює те, що при використанні функцій вікна з операторами оновлення виникають проблеми, і тому я хотів би зрозуміти, чи це прийнятний метод чи його слід уникати.


1
Оновлення CTE є прийнятним і прекрасним. Не маю уявлення, чому це не дозволено в ОНОВЛЕННІ.
ypercubeᵀᴹ

2
Можливо, Hallowe'en якийсь захист?
Аарон Бертран

Відповіді:


5

Функції вікна заборонені в операторах UPDATE, оскільки UPDATE не сумісний із SELECT або ORDER BY.

Функції вікна - це схожі на операції вибору SELECT, які переглядають відповідні рядки та застосовують умови, такі як PARTITION BY і ORDER BY. Крім того, для багатьох функцій вікон необхідний пункт ORDER BY (наприклад, ROW_NUMBER, LAG та FIRST_VALUE).

Операції UPDATE використовують SET замість SELECT, тому SELECT не дозволений ніде на одному рівні запиту. Будь-яка SELECT, що з’являється з UPDATE, повинна міститись у підзапиті.

Якщо заборонити ORDER BY має сенс вважати, що оператор UPDATE є байдужим до порядку, в якому він оновлює рядки.

Немає недоліків використання CTE або іншого підзапиту як вирішення для отримання UPDATE для використання функції вікна. Це звичайна практика, яку обстоюють експерти T-SQL, як Іцік Бен-Ган. (Див. Стор. 29 його книги. Високопродуктивний T-SQL Microsoft SQL Server 2012 за допомогою віконних функцій, де він висвітлює саме цей сценарій.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.