【问题标题】:What is the best way to move some items in a hierarchy table up or down?向上或向下移动层次结构表中的某些项目的最佳方法是什么?
【发布时间】:2013-04-14 19:45:14
【问题描述】:

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

    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

谢谢, 卡多

【问题讨论】:

    标签: sql-server tsql hierarchy


    【解决方案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 是独一无二的,但从您的帖子中肯定不清楚。

    【讨论】:

    • 感谢您的回答!是的,ID 是唯一的,但我不知道如何从 TreeView 获取下一个或上一个 id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多