Вы можете использовать аналитическую функцию row_number, чтобы получить порядок и новый орн, который вы хотите. Например, следующий код создает искомый набор результатов:
with start_nodes as
(
select 1 ref_id, 100 id, 0 orn from dual union
select 1, 200, 1 from dual union
select 1, 300, 2 from dual union
select 1, 400, 3 from dual union
select 2, 160, 0 from dual union
select 2, 260, 1 from dual union
select 2, 360, 2 from dual union
select 2, 460, 3 from dual
)
, start_ord as
(
select a.* , row_number() over (order by orn desc) as row_num from start_nodes a
)
--select * from start_ord;
, middle_nodes as
(
select 1 ref_id, 1000 id, 0 orn from dual union
select 1, 2000, 1 from dual union
select 2, 1500, 0 from dual union
select 2, 2500, 1 from dual union
select 2, 3500, 2 from dual union
select 2, 4500, 3 from dual union
select 2, 5500, 4 from dual
)
, middle_ord as
(
select a.* , row_number() over (order by orn) as row_num from middle_nodes a
)
--select * from middle_ord;
, end_nodes as
(
select 1 ref_id, 150 id, 0 orn from dual union
select 1, 250, 1 from dual union
select 1, 350, 2 from dual union
select 1, 450, 3 from dual union
select 2, 170, 0 from dual union
select 2, 270, 1 from dual union
select 2, 370, 2 from dual union
select 2, 470, 3 from dual
)
, end_ord as
(
select a.* , row_number() over (order by orn) as row_num from end_nodes a
)
--select * from end_ord;
select ref_id, id, row_number() over (partition by ref_id order by ref_id, src, row_num)-1 as orn from
(
select 1 src, a.* from start_ord a
union
select 2 src, b.* from middle_ord b
union
select 3 src, c.* from end_ord c
)
order by ref_id, src, row_num
;