如何使用行号更新表列

时间:2018-12-20 15:18:12

标签: sql sql-server tsql row-number

嗨,我有一个表#Configuration,如果存在任何记录,其中Schedule =N'Test'Sequence >=2000000Kind <> 632,那么我想在计划测试中更新此记录和其他记录的顺序类型<> 632。序列应从10开始,下一个应为+10,但我希望现在的顺序相同  因此,我必须使用[ConfigurationId] = 8更新记录,并为计划测试中种类为<> 632

的所有记录设置Sequence new seqeunce。

我知道我必须使用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

1 个答案:

答案 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