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 
相關問題