如何在SQL Server中使用row_number()函数

4
我想更新行数据,其中列(p_id)的row_number为1。但这个语法会出错:
update app1 
set p_id = 1 
where Row_Number() = 1 over(p_id) 

1
你想要更新哪些行?从你提供的代码中我不太清楚。 - Martin Smith
1
@user,您需要更详细地解释一下您尝试执行的更新逻辑。 - Gabriele Petrioli
@martin 和 gaby---我的逻辑是,如果复选框被选中,那么在按钮单击时,我想根据所选复选框(在网格视图内)更新表格 app1 的列。 - user635545
@user635545 - 你应该只是将主键传递到update语句的where子句中。完全不使用row_number。这是最有效的方法,也是正确的方法。你是否假设(例如)网格中的第7行始终是按p_id排序的表中的第7行?如果同时进行的事务已删除一行,那怎么办?你可能会更新错误的行。 - Martin Smith
@martin 假设p_no是主键,我使用以下代码,但对表没有影响 'update app1 set p_no=1 where p_id=p_no'。 - user635545
上述的where子句没有任何意义。 - user635545
3个回答

7

您不能直接使用ROW_NUMBER()函数 - 您需要使用一个CTE(公共表达式)来实现:

;WITH DataToUpdate AS
(
    SELECT
       SomeID,
       p_id,
       ROW_NUMBER() OVER(ORDER BY .......) AS 'RowNum'
    FROM
       dbo.app1
)
UPDATE DataToUpdate
SET p_id = 1
WHERE 
   RowNum = 1

为了使用ROW_NUMBER函数,您还需要至少一个ORDER BY子句来定义按哪个列对行进行排序。
从您的问题中,不太清楚要按哪个标准(列)来确定ROW_NUMBER(),也不清楚有什么样的列可以唯一地标识一行(以便应用UPDATE)。

1
很抱歉,我不得不删除我的评论,因为我错过了原始帖子中的“更新”部分。在那种情况下,直接使用是不可能的。 - Andriy M
2
顺便说一下,如果CTE只引用了一个表,我认为可以使用“UPDATE cte”进行更新。 - Andriy M
OP的语法是错误的。但你真的尝试在WHERE子句中使用ROW_NUMBER()了吗?我没有,而且此刻也无法检查它。 - Andriy M
@Andriy M:我相信你对第二点是正确的 - 我已经更新了我的答案!感谢你指出这一点。 - marc_s
@Andriy M:是的 - 我尝试过了 - 它会报错:Msg 4108,Level 15,State 1,Line 4 窗口函数只能出现在SELECT或ORDER BY子句中。 - marc_s
显示剩余4条评论

1

这将仅更新该年龄的第一个员工。可用作抽奖类型逻辑

create table emp(name varchar(3),Age int, Salary int, IncentiveFlag bit)

insert into emp values('aaa',23,90000,0);
insert into emp values('bbb',22,50000,0);
insert into emp values('ccc',63,60000,0);
insert into emp values('ddd',53,50000,0);
insert into emp values('eee',23,80000,0);
insert into emp values('fff',53,50000,0);
insert into emp values('ggg',53,50000,0);

update A
set IncentiveFlag=1
from 
(
        Select row_number() over (partition by Age order by age ) AS SrNo,* from emp
)A
where A.SrNo=1

如果您发布代码、XML或数据样本,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮({})以使其格式化和语法高亮! - marc_s
@subhash--非常感谢您,先生...您使用了UPDATE A...A表示视图吗? - user635545

0

删除重复项;使用CTE(公共表达式)语法,按照姓名分组并按照姓名排序,选出姓名、地址和电话,并为每个分组的第一行分配一个行号RN。最后,从CTE中删除行号大于1的记录。


表中的重复记录 - Sagar Byali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接