1

我正在尝试重新排列分层数据集中的节点。这是您所期望的结构。一个菜单项将有一个父菜单项,但在这种情况下......我在一个父项下大约有 n 个菜单项。如果我将菜单项从位置 10 移动到位置 5,如下所示:

1 2 3 4 5 6  7 8 9 10 <-- Original
1 2 3 4 5 10 6 7 8 9  <-- New

有没有办法在一个操作中做到这一点,而不是循环遍历集合并将新位置与现有位置进行比较?我以为我看到了一些可以做到这一点的 RANK 功能,但我似乎找不到它。

更新:这是它的结构:

MENUID, PARENTID, SORT_RANK
1       100       1
2       100       2
3       100       3
4       100       4
5       100       5

如果我将 MENUID 5 向上移动三个位置,它将位于 2 到 3 之间,我想更新排序等级。有没有办法在不获取 parentID 结构并遍历所有记录的情况下做到这一点。

4

3 回答 3

1

我想到了两种可能性。

第一个是将移动项目的 SORT_RANK 更改为前后项目的平均值,因此,如果要移动 MENUID=5 的项目,使其介于 MENUID 2 和 MENUID 3 之间,则应将 SORT_RANK 设置为 MENUID= 5 到 2.5。因此,类似于以下内容:

UPDATE MENU_TABLE
  SET SORT_RANK = ((SELECT SORT_RANK FROM MENU_TABLE WHERE MENUID = 2) + 
                   (SELECT SORT_RANK FROM MENU_TABLE WHERE MENUID = 3)) / 2
  WHERE MENUID = 5;

通过这种方式,您最终会得到具有非整数值的 MENUID,但它们仍然会正确排序。

第二个是执行以下操作:

UPDATE MENU_TABLE
  SET SORT_RANK = SORT_RANK + 1
  WHERE PARENTID = 100 AND
        SORT_RANK > 2;

UPDATE MENU_TABLE
  SET SORT_RANK = 3
  WHERE MENUID = 5;

但是,后一种方法需要两个语句,这可能不是您想要的。

分享和享受。

于 2013-03-07T15:37:09.443 回答
0

我不确定数据按层次结构构建的事实是否重要。

您可以通过一个查询来更新您的订单。假设物品rank_order :R_START到达地点:R_STOP

SQL> variable r_start NUMBER
SQL> variable r_stop NUMBER
SQL> EXEC :r_start := 5; :r_stop := 3;

PL/SQL procedure successfully completed

SQL> UPDATE mytable
  2     SET sort_rank = CASE WHEN sort_rank = :R_START  THEN :R_STOP
  3                      ELSE sort_rank + sign(:R_START - :R_STOP)
  4                      END
  5   WHERE parentid = 100
  6     AND sort_rank BETWEEN LEAST(:R_START, :R_STOP)
  7                       AND GREATEST(:R_START, :R_STOP);

3 rows updated

SQL> select * from mytable order by sort_rank;

    MENUID   PARENTID  SORT_RANK
---------- ---------- ----------
         1        100          1
         2        100          2
         5        100          3
         3        100          4
         4        100          5
于 2013-03-07T15:33:21.187 回答
0

我将用一个问题来回答你的问题;你为什么要求你的SORT_RANK字段由整数组成?

如果该SORT_RANK字段只是 a NUMBER,而不是 a NUMBER(10,0),您可以将任何项目移动到任何位置的任何位置,而不会出现重新排名问题。

于 2013-03-07T20:58:43.103 回答