我想更新行数据,其中列(
p_id
)的row_number
为1。但这个语法会出错:update app1
set p_id = 1
where Row_Number() = 1 over(p_id)
p_id
)的row_number
为1。但这个语法会出错:update app1
set p_id = 1
where Row_Number() = 1 over(p_id)
您不能直接使用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
)。ROW_NUMBER()
了吗?我没有,而且此刻也无法检查它。 - Andriy MMsg 4108,Level 15,State 1,Line 4 窗口函数只能出现在SELECT或ORDER BY子句中。
- marc_s这将仅更新该年龄的第一个员工。可用作抽奖类型逻辑
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
{}
)以使其格式化和语法高亮! - marc_s删除重复项;使用CTE(公共表达式)语法,按照姓名分组并按照姓名排序,选出姓名、地址和电话,并为每个分组的第一行分配一个行号RN。最后,从CTE中删除行号大于1的记录。
update
语句的where
子句中。完全不使用row_number
。这是最有效的方法,也是正确的方法。你是否假设(例如)网格中的第7行始终是按p_id
排序的表中的第7行?如果同时进行的事务已删除一行,那怎么办?你可能会更新错误的行。 - Martin Smith