我是oracle新手。我有三个表:START_NODES:
ref_id id orn
--------------------
1 100 0
1 200 1
1 300 2
1 400 3
2 160 0
2 260 1
2 360 2
2 460 3
Middle_NODES:
ref_id id orn
--------------------
1 1000 0
1 2000 1
2 1500 0
2 2500 1
2 3500 2
2 4500 3
2 5500 4
END_NODES:
ref_id id orn
--------------------
1 150 0
1 250 1
1 350 2
1 450 3
2 170 0
2 270 1
2 370 2
2 470 3
我需要基于ref_id和orn将它们分组在一个表中,其中orn是start_nodes的顺序,然后是中间节点,然后是end_nodes,但是对于start_nodes,顺序必须是降序]]
START_NODES:
ref_id id orn -------------------- 1 400 0 1 300 1 1 200 2 1 100 3 1 1000 4 1 2000 5 1 150 6 1 250 7 1 350 8 1 450 9 2 460 0 2 360 1 2 260 2 2 160 3 2 1500 4 2 2500 5 2 3500 6 2 4500 7 2 5500 8 2 170 9 2 270 10 2 370 11 2 470 12
我尝试使用UNION ALL,但是不允许我在每个选择查询中使用order by
我是oracle新手。我有三个表:START_NODES:ref_id id orn -------------------- 1100 0 1 200 1 1 300 2 1 400 3 2 160 0 2 ...] >
您可以使用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
;