Как поставить в запись номер для сохранения последовательной нумерации учётом пропусков?

Есть таблица для хранения дерева узлов, в которой есть столбцы

тип элемента дерева| id root элемента | id родителя | порядковый номер в родителе
      4                    1                1                     1
      4                    1                1                     2
      4                    1                1                     5
      4                    2                66                    1
      4                    2                66                    2
      4                    2                66                    7

Нужно скопировать все элементы, у которого id root элемента равен 2 в тот, у которого id root элемента равен 1. Но так, если совпадает тип элемента и его порядковый номер, то перенумеровать номер копируемого объекта в минимальный свободный в диапазоне от 1 до 99. Т.е. если у исходной структуры у элемента номера идут 1,2,5 у копируемого 1,2,7, то итог должен быть 1,2,3,4,5,7.

Т.е. задача при совпадении номеров перегенерировать номер в наименьший свободный в диапазоне от 1 до 99

Предположим сгенерировать цифры я могу так

SELECT "number" FROM (
    SELECT generate_series(1, (
        SELECT MAX("number") + 99 as "number" 
        FROM tree_elements te2
        WHERE root_id = 1 AND element_type_id = 4)) AS "number"
        EXCEPT SELECT "number" 
               FROM tree_elements te
               WHERE root_id = 1 AND element_type_id = 4
) s
ORDER BY "number" LIMIT 99;

Но как это всё прикрутить к копированию строк таблицы я не понимаю. Какие есть мысли на этот счёт? Как эту же задачу решить средствами БД, средствами постгрес? В какую сторону копать? Есть ли подобные функции? Или как-то использовать вложенные циклы?


Ответы (0 шт):