如何在 Sql 中 table 行的两个值之间切换

How to Toggle between two values from table rows in Sql

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

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

示例数据:

Id   Name   DisplayOrder
---------------------------
 1   Home        1
 2   Products    2
 3   Contact     3
 4   Career      4

我想编写一个查询来更新 DisplayOrder displayOrder 是给定行的下一个更高显示顺序值的两行。

例如Contact = 4, Career = 3

预期输出:

1  Home      1
2  Products  2
3  Contact   4
4  Career    3

如何执行更新操作以在两个并发行的两行显示顺序之间切换(按 Displayorder 排序)?

输入参数:仅一行Id

尝试这样的事情:

UPDATE NavBar  
SET     DisplayOrder =  CASE  
                        WHEN DisplayName  = @row1 THEN (select DipslayOrder from NavBar where DisplayName = @row2)  
                        WHEN DisplayName  = @row2 THEN (select DipslayOrder from NavBar where DisplayName = @row1) 
                        END 
WHERE   DisplayName IN (@row1, @row2);

希望这对你有用。

您需要从您的输入和您的下一条记录中获取 Displayorder
比你可以更新这一切。 它有点复杂,但我测试了它是有效的。
同样,当 DisplayOrder 中有间隙时,您也可以通过这种方式避免麻烦。

declare @InputID int = 3
declare @DisplayOrderInput int
declare @ID int
declare @DisplayOrder int

select @DisplayOrderInput = DisplayOrder from NavBar where ID = @InputID

select top 1
       @ID = ID,
       @DisplayOrder = DisplayOrder
from   NavBar
where  DisplayOrder > (select DisplayOrder from NavBar where ID = @InputID)
order by DisplayOrder

update NavBar set DisplayOrder = @DisplayOrder where ID = @InputID
update NavBar set DisplayOrder = @DisplayOrderInput where ID = @ID

select * from NavBar
    Try with this.. For any id it will work :

DECLARE @INPUT INT=3 

UPDATE A 
SET    A.DISPLAYORDER = B.DISPLAYORDER 
FROM   #TEMP A 
       INNER JOIN (SELECT ID, 
                          NAME, 
                          CASE 
                            WHEN ID = @INPUT THEN DISPLAYORDER + 1 
                            WHEN ID = @INPUT + 1 THEN DISPLAYORDER - 1 
                            ELSE DISPLAYORDER 
                          END DISPLAYORDER 
                   FROM   #TEMP)B 
               ON A.ID = B.ID    


    Output :

    ID  NAME    DISPLAYORDER 
    1   Home        1
    2   Products    2
    3   Contact     4
    4   Career      3

试试这个-

-- 1) Get Current row's displayorder and Next Row's id in Temp table
SELECT nb1.DisplayOrder, nb2.id 
into #TempNavBar
FROM [NavBar] nb1
INNER JOIN [NavBar] nb2 ON nb1.id = nb2.id - 1
WHERE nb1.Id = 3

-- 2) Update Actual table by using Self join on Next row
UPDATE nb1
    SET nb1.DisplayOrder = nb2.DisplayOrder
FROM [NavBar] AS nb1
INNER JOIN [NavBar] AS nb2 ON nb1.id = nb2.id - 1
WHERE nb1.Id = 3

-- 3). Update Actual table by joining it with temp table
UPDATE nb1
    SET nb1.DisplayOrder = tmp2.DisplayOrder
FROM [NavBar] AS nb1
INNER JOIN #TempNavBar AS tmp2 ON nb1.id = tmp2.id

-- Cleanup operation
DROP TABLE #TempNavBar

我在这里所做的是将 NavBar table 与其自身连接,但在下一行 ID 上并获取当前行的 DisplayOrder 列和下一行的 id 列value 并将其插入 temp table.

在第二个查询中,我用下一行的值更新了当前行的 displayOrder 值。

在第三个查询中,我通过将 [NavBar] table 与临时 table.

结果

Id  Name    DisplayOrder
------------------------
1   Home        1
2   Products    2
3   Contact     4
4   Career      3