如何在SQL UPDATE语句中使用LEAD函数?报错求助
解决UPDATE语句中使用LEAD窗口函数报错的问题
SQL Server不允许在UPDATE的SET子句中直接使用窗口函数(如LEAD),报错提示:
Msg 4108, Level 15, State 1, Line 6
Windowed functions can only appear in the SELECT or ORDER BY clauses.
要实现“用后2行的AltCode值更新String1列”,可以先通过CTE或子查询计算出每个行对应的目标值,再关联原表完成更新,以下是几种可行方案:
方案一:使用CTE计算LEAD值后更新
USE [MEKON-EPE]; WITH MaterialWithLead AS ( SELECT String1, LEAD(AltCode, 2) OVER (ORDER BY AltCode) AS Next2AltCode FROM [clroot].[Material] ) UPDATE MaterialWithLead SET String1 = Next2AltCode;
方案二:通过子查询关联更新(适用于有唯一主键的表)
假设表Material有唯一主键MaterialID,可以用主键关联子查询结果:
USE [MEKON-EPE]; UPDATE m SET m.String1 = sub.Next2AltCode FROM [clroot].[Material] m JOIN ( SELECT MaterialID, LEAD(AltCode, 2) OVER (ORDER BY AltCode) AS Next2AltCode FROM [clroot].[Material] ) sub ON m.MaterialID = sub.MaterialID;
方案三:用ROW_NUMBER生成行号关联更新(无主键时适用)
如果表没有唯一主键,可以先给每行生成唯一行号,再通过行号关联获取后2行的AltCode:
USE [MEKON-EPE]; WITH MaterialWithRowNum AS ( SELECT String1, AltCode, ROW_NUMBER() OVER (ORDER BY AltCode) AS RowNum FROM [clroot].[Material] ) UPDATE m1 SET m1.String1 = m2.AltCode FROM MaterialWithRowNum m1 LEFT JOIN MaterialWithRowNum m2 ON m1.RowNum = m2.RowNum - 2;
以上方案均先通过SELECT逻辑计算出需要的LEAD值,再将结果与原表关联执行更新,避开了窗口函数不能直接用于SET子句的限制。
内容的提问来源于stack exchange,提问作者D.j. Black
相关产品推荐
相关产品推荐

