1

階層データ セット内のノードを再ランク付けしようとしています。これはあなたが期待するように構成されています。メニュー項目には親メニュー項目がありますが、この場合... 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

セットをループして新しい位置を既存の位置と比較するのではなく、1 回の操作でこれを行う方法はありますか? これを行うRANK機能があると思ったのですが、見つけられないようです。

更新:構造は次のとおりです。

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

MENUID 5 を 3 つ上に移動すると、2 から 3 の間に収まるので、並べ替えランクを更新したいと考えています。parentID 構造体を取得してすべてのレコードをループせずにこれを行う方法はありますか。

4

3 に答える 3

1

2 つの可能性が思い浮かびます。

1 つ目は、移動するアイテムの SORT_RANK を前後のアイテムの平均に変更することです。そのため、MENUID=5 のアイテムを移動して MENUID 2 と MENUID 3 の間に配置する場合は、MENUID= の SORT_RANK を設定します。 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 が作成されますが、それでも適切に並べ替えられます。

2番目は、次のことを行うことです。

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;

ただし、この後者の方法では、探しているものではない可能性がある 2 つのステートメントが必要です。

共有してお楽しみください。

于 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 に答える