1

切换我有一个表名[NavBar]这些列:如何在两个值之间,从表中的行在SQL

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只有

+0

输入参数应该是行,你想在显示它的位置的ID,对不对? – Danieboy

+0

我的意思是如果输入参数Id = 3(即接触),那么我想切换到下一个显示顺序行(即事业,即4) –

+0

你是什么意思的“输入参数:只有一行的ID”? –

回答

1

您需要从输入中获取Displayorder,并从您的下一个记录中获取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 
1

尝试是这样的:

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); 

希望这对你的作品。

+0

我该如何执行这个查询? @ row1,@ row2或DidplayName的值是什么? –

1
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

尝试这个 -

-- 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表本身,而是对下一行ID和读取当前行的DisplayOrder列,下一行的id列值并将其插入临时表中。

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

在第三个查询中,我通过将临时表加入[NavBar]表来更新displayOrder值与临时表DisplayOrder值。

结果

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