想象一下,我想通过将菜单替换为下一个或上一个项目来重新排序(更改菜单中项目的位置或顺序)。为此,我使用以下代码:
DECLARE @SO tinyint --, @MenuID uniqueidentifier
--SET @MenuID = (Select top 1 MenuID from MenuItems where MenuItemID = @ID)
SET @SO = (Select top 1 SO from MenuItems where MenuItemID = @ID and MenuID = @MenuID)
if @SO > 1
begin
UPDATE dbo.MenuItems SET SO = @SO WHERE MenuItemID = (select top 1 MenuItemID from MenuItems WHERE SO = @SO - 1 and MenuID = @MenuID)
UPDATE dbo.MenuItems SET SO = @SO - 1 WHERE MenuItemID = @ID
END
此代码适用于每次向上或向下移动一次。我有两个问题:
自:
> 1
> 2
> 1
> 2
> 3
> 3
> 4
> a
> b
> 5
要:
> 1
> 2
> 1
> 2
? a
? 5
> 3
> 3
> 4
> b
谢谢, Kardo
答案 0 :(得分:1)
您可以使用单个查询交换两个任意条目的顺序,如下所示:
update dbo.MenuItems
set SO = case
when MenuItemId = @FirstId then ( select SO from dbo.MenuItems where MenuItemId = @SecondId )
else ( select SO from dbo.MenuItems where MenuItemId = @FirstId ) end
where MenuItemId in ( @Firstid, @SecondId )
可以在查询之前执行id的查找,也可以将其嵌入其中。
由于您未在问题中包含表架构,因此查询可能需要稍微调整一下。我认为MenuItemId
是唯一的,但你的帖子肯定不清楚。