Как обновить столбец таблицы, используя номер строки
Привет у меня есть стол #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