아래와 같은 업데이트 문을 실행할 때 오류 메시지가 나타납니다.
창 함수는 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를 해결 방법으로 사용하지 않아야합니까?
내 관심사는 update 문과 함께 창 함수를 사용할 때 문제가 있으므로 이것이 허용 가능한 방법인지 또는 피해야하는지 이해하고 싶습니다.
답변
UPDATE가 SELECT 또는 ORDER BY와 호환되지 않기 때문에 UPDATE 문에서 창 함수는 허용되지 않습니다.
창 함수는 관련 행을 다시 검사하고 PARTITION BY 및 ORDER BY와 같은 조건을 적용하는 범위가 지정된 SELECT 문과 같습니다. 또한 많은 창 함수에는 ORDER BY 절 (예 : ROW_NUMBER, LAG 및 FIRST_VALUE)이 필요합니다.
UPDATE 문은 SELECT 대신 SET을 사용하므로 같은 쿼리 수준에서 SELECT를 사용할 수 없습니다. UPDATE로 나타나는 모든 SELECT는 하위 쿼리에 포함되어야합니다.
ORDER BY를 허용하지 않으면 UPDATE 문이 행을 갱신하는 순서와 무관하다는 점을 고려하는 것이 좋습니다.
CTE 또는 다른 하위 쿼리를 사용하여 UPDATE를 사용하여 창 함수를 사용하는 방법으로 인한 단점은 없습니다. Itzik Ben-Gan과 같은 T-SQL 전문가들이 주장하는 일반적인 관행입니다. ( 이 시나리오를 다루는 창 기능을 사용하는 Microsoft SQL Server 2012 고성능 T-SQL의 책 29 페이지를 참조하십시오 .)