Эффективный способ обновления столбца арифметической последовательностью чисел после операции удаления - PullRequest
1 голос
/ 29 сентября 2011

У меня есть PresentationSlide таблица:

PresentationSlide
    PresentationSlideId
    PresentationId
    Content
    Order

и пример строк:

+---------------------+----------------+---------+-------+
| PresentationSlideId | PresentationId | Content | Order |
+--------+------------+----------------+---------+-------+
|                 123 |              3 | "bla"   |     1 |
|                  23 |              3 | "bla2"  |     2 |
|                  22 |              3 | "bla3"  |     3 |
|                 100 |              3 | "bla4"  |     4 |
|                 150 |              3 | "bla5"  |     5 |
+---------------------+----------------+---------+-------+    

Я хочу сохранить арифметическую последовательность чисел (1,2,3,4, ...) в столбце Order после операции DELETE.

Например, если я удалю третью строку (PresentationSlideId = 22), значения в столбце заказа будут: (1,2,4,5) Я хочу обновить Order следующим образом:

PresentationSlideId = 100:  update order from 4 to 3
PresentationSlideId = 150:  update order from 5 to 4

Как наиболее эффективный способ сделать такое обновление? Можно ли сделать это, используя только один оператор UPDATE? Я мог бы сделать это, используя курсор и цикл, но это не кажется эффективным.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

1) Order - очень плохое имя для столбца, так как это ключевое слово SQL

2) Было бы намного лучше, если бы вы могли справляться с пробелами в заказе (и, возможно, переключиться на использованиеfloat, так что вы можете вставить дробные значения), потому что в вашей текущей модели каждая вставка, обновление или удаление может повлиять на всю таблицу.Это плохо масштабируется.Вычисление ордера с использованием ROW_NUMBER() во время выбора обычно лучше.

3)

create table #PresentationSlide (
    PresentationSlideID int not null,
    PresentationId int not null,
    Content varchar(10) not null,
    [Order] int not null
)
insert into #PresentationSlide (PresentationSlideId , PresentationId , Content , [Order])
select 123,3,'bla',1 union all
select 23,3,'bla2',2 union all
select 22,3,'bla3',3 union all
select 100,3,'bla4',4 union all
select 150,3,'bla5',5


delete from #PresentationSlide where PresentationSlideId = 22

;With Reorder as (select PresentationSlideId,ROW_NUMBER() OVER (ORDER BY [Order]) as NewOrder from #PresentationSlide)
update ps set [Order] = NewOrder
from #PresentationSlide ps inner join Reorder r on ps.PresentationSlideId = r.PresentationSlideId

select * from #PresentationSlide order by [Order]

drop table #PresentationSlide
2 голосов
/ 29 сентября 2011
;with C as
(
  select [Order],    
         row_number() over(order by [Order]) as rn
  from PresentationSlide 
)
update C set
  [Order] = rn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...