0

首先,我需要一个OracleMySQL的解决方案。

我有一个文件夹表:

编号 | 姓名 | parent_id | 位置
_________________________________
1 | 根 | 空 | 1
2 | 一个 | 1 | 1
3 | 乙 | 1 | 2
4 | b1 | 3 | 1
5 | b2 | 3 | 2
6 | c | 1 | 3
7 | d | 1 | 4
8 | 电子| 1 | 5

给定树:

根
  |_ 一个
  |_ b
  | |_b1
  | |_b2
  |_c
  |_d
  |_e

该列position具有NOT NULLandUNIQUE约束。

问题:
有时我必须在单个查询中删除一些文件夹(例如:删除文件夹'a'、'b1'、'd')。这样做时,我的文件夹位置有间隙:

编号 | 姓名 | parent_id | 位置
_________________________________
1 | 根 | 空 | 1
3 | 乙 | 1 | 2
5 | b2 | 3 | 2
6 | c | 1 | 3
8 | 电子| 1 | 5

因此,我需要在单个请求中更新表以更新位置列并按特定顺序(以防止UNIQUE约束)以获得结果:

编号 | 姓名 | parent_id | 位置
_________________________________
1 | 根 | 空 | 1
3 | 乙 | 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

我解决了这个问题:

甲骨文

    更新文件夹 t
    SET 位置 = ( 选择计数 (*)
    FROM 文件夹 f1 INNER JOIN 文件夹 f2 on ( f1.parent_id = f2.parent_id 和 f1.position >= f2.position )
    其中 f1.id = t.id 和 t.parent_id = f1.parent_id
    按 f1.id、f1.position 分组);

MySQL

    更新文件夹 f
    INNER JOIN (选择 f1.id, f1.parent_id, count(*) as newPos
    FROM 文件夹 f1 INNER JOIN 文件夹 f2 on ( f1.parent_id = f2.parent_id 和 f1.position >= f2.position)
    GROUP BY f1.parent_id, f1.position) t on (t.id = f.id and t.parent_id = f.parent_id)
    SET f.position = t.newPos

于 2015-09-30T09:25:25.203 回答