0

まず、OracleMySQLのソリューションが必要です。

私はフォルダテーブルを持っています:

ID | 名前 | 親 ID | 位置
_________________________________
1 | ルート | null | null | 1
2 | | | 1 | 1
3 | b | 1 | 2
4 | b1 | 3 | 1
5 | b2 | 3 | 2
6 | c | 1 | 3
7 | d | 1 | 4
8 | え | 1 | 5

与えられたツリー:

根
  |_a
  |_b
  | | |_b1
  | | |_b2
  |_c
  |_d
  |_e

positionにはNOT NULLandUNIQUE制約があります。

問題 :
1 つのクエリでいくつかのフォルダーを削除する必要がある場合があります (例: フォルダー 'a'、'b1'、'd' を削除します)。これを行うと、フォルダーの位置にギャップがあります:

ID | 名前 | 親 ID | 位置
_________________________________
1 | ルート | null | null | 1
3 | b | 1 | 2
5 | b2 | 3 | 2
6 | c | 1 | 3
8 | え | 1 | 5

したがって、位置列を更新するための単一のリクエストでテーブルを更新し、(UNIQUE制約を防ぐために) 特定の順序で結果を取得する必要があります。

ID | 名前 | 親 ID | 位置
_________________________________
1 | ルート | null | null | 1
3 | b | 1 | 2
5 | b2 | 3 | 1
6 | c | 1 | 2
8 | え | 1 | 3

何か案が ?

ありがとう

4

2 に答える 2

1

これを試して

MERGE
INTO    YourTable t1
USING   (
        SELECT pk_id, gap_ID, row_num() over (order by gap_id) as newGap
        FROM YourTable t2
        ) as sub
ON      (t1.pk_id = t2.pk_id)
WHEN MATCHED THEN
UPDATE
SET     gap_ID = newGap;
于 2015-09-28T07:49:04.933 に答える
0

私は問題を解決しました:

オラクル

    UPDATE フォルダ t
    位置を設定 = ( カウントを選択(*)
    FROM フォルダー f1 INNER JOIN フォルダー f2 on ( f1.parent_id = f2.parent_id and f1.position >= f2.position )
    WHERE f1.id = t.id AND t.parent_id = f1.parent_id
    GROUP BY f1.id、f1.position );

MySQL

    UPDATE フォルダ f
    INNER JOIN ( f1.id、f1.parent_id、count(*) を newPos として選択
    FROM フォルダー f1 INNER JOIN フォルダー f2 on ( f1.parent_id = f2.parent_id and f1.position >= f2.position)
    GROUP BY f1.parent_id, f1.position) t on ( t.id = f.id および t.parent_id = f.parent_id)
    SET f.position = t.newPos

于 2015-09-30T09:25:25.203 に答える