向上或向下移动层次结构表中的某些项目的最佳方法是什么?

时间:2013-04-14 19:45:15

标签: sql-server tsql hierarchy

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

    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. 如果我想将某些项目同时移动到更高或更低的某些步骤,如下所示:?
  3. 自:

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

    要:

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

    谢谢, Kardo

1 个答案:

答案 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是唯一的,但你的帖子肯定不清楚。

相关问题