Я представлю следующее, он не воспроизводит запрошенный вами результат точно, но он удовлетворяет требованию "минимального свободного числа последовательностей". Который между прочим ваш запрос не делает, если ваше намерение создает плотную последовательность. Он строит 2 CTE: util_numbers и merge_numbers: «Вессор_значения» начинается с генератора «свободных чисел», который принимает их за кардинальные значения, затем добавляет к этому набору порядковый номер, указывающий последовательность, которой должны быть присвоены кардинальные числа. Т.е. генератор производит набор 3,4,6, ... Порядковое присваивание преобразует это в набор (1,3), (2,4), (3,6). Это означает, что первое значение, которое нужно использовать, равно 3, второе значение, которое нужно использовать в 4, et c. Merge_numbers строится аналогичным образом, извлекая существующие «числа» в качестве кардинальных значений и генерируя порядковые числа, приводящие к наборам как (1,1), (2,2), (3,7) ... Эти наборы затем объединяются по порядковым номерам, образуя набор (3,1), (4,2), (7,6), означающий при обновлении сливающегося набора до 3, где текущее значение равно 1 ... (в этом разница к запрашиваемому приходит, когда он обновляет «число» с 7 до 6.
with avail_numbers(avail_ordinal ,avail_number) as
( select row_number() over(), number_in_parent
from ( select number_in_parent
from ( select generate_series(1, ( select max(number_in_parent) + 99 as number_in_parent
from tree_elements
where root_id = 1
and element_type_id = 4
)
) as number_in_parent
except
select number_in_parent
from tree_elements te
where root_id = 1 and element_type_id = 4
) s
order by number_in_parent limit 99
) n
)
, merge_numbers (merge_ordinal , number_in_parent) as
( select row_number() over(),number_in_parent
from ( select number_in_parent
from tree_elements
where root_id = 2
and element_type_id = 4
order by number_in_parent
) m
)
update tree_elements te
set root_id = 1
, number_in_parent = mseq.avail_number
from (select mn.number_in_parent,an.avail_number
from avail_numbers an
join merge_numbers mn
on (an.avail_ordinal = mn.merge_ordinal )
) mseq
where root_id = 2
and element_type_id = 4
and te.number_in_parent = mseq.number_in_parent;
Однако существует другая проблема. Что происходит, когда общее количество строк в комбинации 2 root_id, element_type_id равно 100 или больше.