SQL Server - почему функции окна не разрешены в операциях обновления?

При запуске оператора обновления, например, ниже, я получаю сообщение об ошибке, сообщающее мне, что

  

Оконные функции могут отображаться только в предложениях 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 в качестве обходного пути?

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

7 голосов | спросил Neil P 2 PM00000020000000331 2016, 14:31:03

1 ответ


4

Функции окна не разрешены в операторах 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 SQL Server 2012 с использованием Функции окна , где он охватывает этот точный сценарий.)

ответил Doug Lane 4 Jpm1000000pmWed, 04 Jan 2017 19:58:13 +030017 2017, 19:58:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132