oracle-根据顺序在一个表中收集多个表

问题描述 投票:0回答:1

我是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 ...] >

oracle
1个回答
0
投票

您可以使用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
;
© www.soinside.com 2019 - 2024. All rights reserved.