oracle - собрать несколько таблиц в одну таблицу на основе заказа - PullRequest
0 голосов
/ 03 апреля 2020

Я новичок в 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:

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 в каждом запросе выбора

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете использовать аналитическую функцию 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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...