0

First of all, I need a solution for Oracle and MySQL.

I Have a folder table :

id | name | parent_id | position
_________________________________
1  | root | null      | 1
2  | a    | 1         | 1
3  | b    | 1         | 2
4  | b1   | 3         | 1
5  | b2   | 3         | 2
6  | c    | 1         | 3
7  | d    | 1         | 4
8  | e    | 1         | 5

given the tree :

root
  |_ a
  |_ b
  |  |_b1
  |  |_b2
  |_c
  |_d
  |_e

The column position has a NOT NULL and UNIQUE constraint.

Problem :
Sometimes i have to delete some folders in a single query (ex : delete folder 'a', 'b1', 'd'). When doing this i have gaps in folders position :

id | name | parent_id | position
_________________________________
1  | root | null      | 1
3  | b    | 1         | 2
5  | b2   | 3         | 2
6  | c    | 1         | 3
8  | e    | 1         | 5

So I need to update the table in single request for updating the position column and in a specific order (to prevent the UNIQUE constraint) to obtain the result :

id | name | parent_id | position
_________________________________
1  | root | null      | 1
3  | b    | 1         | 2
5  | b2   | 3         | 1
6  | c    | 1         | 2
8  | e    | 1         | 3

Any Idea ?

Thanks

Yoplaboom
  • 554
  • 3
  • 13

2 Answers2

1

Try this

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;
Juan Carlos Oropeza
  • 47,252
  • 12
  • 78
  • 118
0

I solved the problem :

Oracle

    UPDATE folders t 
    SET position = ( select count(*)
    FROM folders f1 INNER JOIN folders 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 folders f
    INNER JOIN ( select f1.id, f1.parent_id, count(*) as newPos
    FROM folders f1 INNER JOIN folders 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 and t.parent_id = f.parent_id)
    SET f.position = t.newPos

Yoplaboom
  • 554
  • 3
  • 13