Как обновить столбец таблицы, используя номер строки

Привет у меня есть стол #Configuration и если существует какая-либо запись, где Schedule =N'Test' а также Sequence >=2000000 а также Kind <> 632 тогда я хочу обновить Sequence на эту и другие записи в расписании теста, где Kind <>632. Последовательность должна начинаться с 10, а следующая должна быть +10, но я хочу тот же порядок, который сейчас есть. Поэтому мне нужно обновить запись с [ConfigurationId] = 8 и установить новую последовательность Последовательность для всех записей в тесте по расписанию, где Kind <> 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

1 ответ

Вы не можете использовать 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
Другие вопросы по тегам