【问题标题】:How to toggle between two values of concurrent table rows in sql如何在sql中的并发表行的两个值之间切换
【发布时间】:2016-12-04 00:13:36
【问题描述】:

我有一个表名[NavBar],其中包含这些列:

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

样本数据:

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

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

例如Contact = 4, Career = 3

预期输出:

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

输入参数:Id 仅一行

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


    【解决方案1】:

    如果您要更新 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
    

    【讨论】:

    • @BimalDas 为什么?它工作正常。你应该用分号开始你的with
    • @BimalDas 如果您尝试更新最后一行,会发生什么?
    • 我可能会限制代码?你有一个问题。
    • @BimalDas 好的,完成。如果参数 id 是最后一个 displayOrder,它不会更新任何东西
    • @BimalDas 是的,只需更改@declare @id nvarchar
    【解决方案2】:

    我觉得应该可以

    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
    

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2023-01-05
      • 1970-01-01
      • 2012-06-22
      相关资源
      最近更新 更多