Простой рекурсивный запрос, чтобы получить то, что вы хотите:
with
i (root_part_no, sub_part_no, sub_part_quant, lvl) as (
select
root_part_no, sub_part_no, sub_part_quant, 1
from tblbom where root_part_no like '132EE%' and isemptyind <> 'Yes'
union all -- anchor member above; recursive member below
select
p.root_part_no, p.sub_part_no, p.sub_part_quant, i.lvl + 1
from i
join tblbom p on p.root_part_no = i.sub_part_no
)
select *
from i
order by lvl, root_part_no, sub_part_no
Обратите внимание на предложение UNION ALL
. Он отделяет якорный запрос - выполняется только один раз - от рекурсивного запроса , который выполняется несколько раз для каждой новой строки , полученной в результате, до тех пор, пока больше не производит новых строк. Таким образом, этот запрос может проходить несколько уровней, а не только 2 из них.
Редактировать
Я протестировал запрос выше со следующими (составленными) данными и добавил столбец LVL
, чтобы показать рекурсивный уровень:
create table tblbom (
root_part_no varchar2(10),
sub_part_no varchar2(10),
sub_part_quant number(6),
isemptyind varchar2(10) default 'No'
);
insert into tblbom (root_part_no, sub_part_no, sub_part_quant) values ('132EER', '122FYY', 1);
insert into tblbom (root_part_no, sub_part_no, sub_part_quant) values ('132EER', '766WWW', 2);
insert into tblbom (root_part_no, sub_part_no, sub_part_quant) values ('122FYY', '849ZXA', 3);
insert into tblbom (root_part_no, sub_part_no, sub_part_quant) values ('766WWW', '111111', 4);
insert into tblbom (root_part_no, sub_part_no, sub_part_quant) values ('849ZXA', null, 5);
insert into tblbom (root_part_no, sub_part_no, sub_part_quant) values ('111111', null, 6);
Результат (включая уровень):
ROOT_PART_NO SUB_PART_NO SUB_PART_QUANT LVL
------------ ----------- -------------- ---
132EER 122FYY 1 1
132EER 766WWW 2 1
122FYY 849ZXA 3 2
766WWW 111111 4 2
111111 <null> 6 3
849ZXA <null> 5 3