0

想象一下,我想通过用下一个或上一个项目替换它的顺序来重新排序(更改位置或顺序)菜单中的一个项目。为此,我使用如下代码:

    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
    > 1
    > 2
    > 3
> 3
> 4
    > a
    > b
> 5

至:

> 1
> 2
    > 1
    > 2
    ? a
    ? 5
    > 3
> 3
> 4
    > b

谢谢,卡多

4

1 回答 1

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是独一无二的,但从你的帖子中肯定不清楚。

于 2013-04-14T23:13:27.160 回答