嗨,我有一个表#Configuration
,如果存在任何记录,其中Schedule =N'Test'
和Sequence >=2000000
和Kind <> 632
,那么我想在计划测试中更新此记录和其他记录的顺序类型<> 632。序列应从10开始,下一个应为+10,但我希望现在的顺序相同
因此,我必须使用[ConfigurationId] = 8更新记录,并为计划测试中种类为<> 632
我知道我必须使用rownumber()
,但我不知道如何使用。
if object_id(N'tempdb..#Configuration') is not null
drop table #Configuration;
create table #Configuration
(
[ConfigurationId] int
,Kind int
,Schedule nvarchar(100)
,[Sequence] int
);
insert into #Configuration
Values ( 1,15,N'I',10)
,( 300,16,N'I',20)
,( 248,817,N'Test',3000)
,( 675,817,N'Test',20)
,( 432,632,N'Test',2000000)
,( 889,632,N'Test',2000010)
,( 1,632,N'Test',2000020)
,( 8,999,N'Test',2000030)
,( 44453,632,N'Test',2000040)
select * from #Configuration
答案 0 :(得分:0)
不能在更新语句中直接使用ROW_NUMBER
,因此需要将SELECT
语句包装在派生表或公用表表达式中。要保留现有顺序,请在ORDER BY [Sequence]
子句中指定OVER
。另外,过滤出要保留哪些值的行(即添加WHERE Kind <> 632 and Schedule = 'Test'
)。由于您要使用间隔(10、20、30而不是1、2、3)的序列,因此只需将生成的行号乘以10。然后,使用此SELECT
语句更新临时表,如下所示:
;with cte as (
select c.ConfigurationId, ROW_NUMBER() OVER(ORDER BY [Sequence]) * 10 as NewSequence
from #Configuration c
where c.Kind <> 632 and c.Schedule = 'Test'
)
update #Configuration set
[Sequence] = cte.NewSequence
from cte
where #Configuration.ConfigurationId = cte.ConfigurationId
select * from #Configuration