窗口函数只能出现在 SELECT 或 ORDER BY 子句中--update in cursor
Posted
技术标签:
【中文标题】窗口函数只能出现在 SELECT 或 ORDER BY 子句中--update in cursor【英文标题】:Windowed functions can only appear in the SELECT or ORDER BY clauses-update in cursor 【发布时间】:2017-01-29 13:36:31 【问题描述】:Declare @Customerid int
DECLARE ChangeCustomerName CURSOR FOR
select customerid from customer
OPEN ChangeCustomerName
FETCH NEXT FROM ChangeCustomerName into @Customerid
WHILE @@fetch_status = 0
BEGIN
update customer set customername ='Customer'
+convert (varchar(10),ROW_NUMBER() OVER(ORDER BY customerid ASC))
where customerid=@Customerid
FETCH NEXT FROM ChangeCustomerName into @Customerid
END
close ChangeCustomerName
deallocate ChangeCustomerName
窗口化函数只能出现在SELECT或ORDER BY子句中--update in cursor
【问题讨论】:
你应该解释你想要做什么。 【参考方案1】:您似乎正在尝试将客户名称设置为连续值。为此,您不需要光标!就像这样:
with toupdate as (
select c.*, row_number() over (order by customerid) as seqnum
from customer c
)
update toupdate
set customername = 'Customer' + convert(varchar(10), seqnum);
您应该尽可能避免使用光标。基于集合的操作效率更高,并且通常会产生更简单的代码。
【讨论】:
你太他妈快了!像往常一样,你在我忙着写我的时候发布了你的答案……:-) 你每天会收到多少次“你是机器”的验证码?【参考方案2】:不确定您为什么要创建客户名称。
您当前的方法可能适用于现有记录,但对于新条目,您已再次运行更新查询,并且同一客户可能会在某些删除后获得不同的客户名称。所以我建议你创建一个计算列。
您可以将customername
设为计算列
Alter table customer
add customername as 'Customer'+convert (varchar(10),customerid) PERSISTED
注意:它可能不是连续的,但如果customerid
是唯一的,它将是唯一的
【讨论】:
以上是关于窗口函数只能出现在 SELECT 或 ORDER BY 子句中--update in cursor的主要内容,如果未能解决你的问题,请参考以下文章
SQL 错误 - Windows 函数只能出现在 SELECT 或 ORDER BY 子句中
SQL 窗口函数 - SELECT DISTINCT ORDER BY LIMIT
无法在 Oracle 的窗口函数中使用 ORDER BY 子句
如何在 select 语句中包含 PERCENTILE_CONT 列,而不会生成有关 ORDER BY 子句或聚合函数的错误?