如何在 sql 中并发 table 行的两个值之间切换

How to toggle between two values of concurrent table rows in sql

我有一个 table 名称 [NavBar] 包含这些列:

Id [int]
Name [nvarchar]
DisplayOrder [int]

示例数据:

Id   Name   DisplayOrder
---------------------------
 100   Home        1
 101   Products    2
 102   Contact     3
 103   Career      4

如何执行更新操作以在 two concurrent rows 的两行 DisplayOrder 之间切换(按 Displayorder 排序)?

例如Contact = 4, Career = 3

预期输出:

100  Home      1
101  Products  2
102  Contact   4
103  Career    3

输入参数:仅一行Id

如果您正在更新 id = 102(然后是 103)

 drop table navBar;
 create table navBar
 (Id [int],
Name [nvarchar] (200),
DisplayOrder [int]);

insert into navBar
values
 (100,   'Home'      ,  1),
 (101,   'Products',    2),
 (102 ,  'Contact',     3),
 (103  , 'Career',      4);

 declare @id int;

 set @id = 102

 ; with t as(
 select id,  name, DisplayOrder, 
        lag(id) over(order by DisplayOrder) lgid, 
        lag(DisplayOrder) over(order by DisplayOrder) lgDisplayOrder,
        lead(DisplayOrder) over(order by DisplayOrder) ldDisplayOrder
 from navBar)
 update t
   set DisplayOrder = case @id when id then ldDisplayOrder else lgDisplayOrder end
 where (@id = id and ldDisplayOrder is not null)
   or  (@id = lgid);


 select * from navBar;

输出

Id  Name    DisplayOrder
100 Home    1
101 Products    2
102 Contact 4
103 Career  3

我觉得应该可以

declare @Id int = 101

update t1 
set Id = new_ID + @Id
from NavBar t1
inner join  (select DisplayOrder, row_number()  over (order by DisplayOrder) as new_ID
            from NavBar where Id > @Id) as t2  on t2.DisplayOrder = t1.DisplayOrder