如何在 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
我有一个 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