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