Я думаю, что вам нужно пройтись по дереву с другой стороны, и затем можно использовать sys_connect_by_path()
для объединения имен сегментов и connect_by_isleaf
, чтобы показать только лист узлы:
select col_a, col_b
from (
select ltrim(sys_connect_by_path(seg, ' - '), ' - ') as col_a,
seg_id as col_b,
connect_by_isleaf as isleaf
from my_table
start with seg = 'Prepaid'
connect by parent_seg_id = prior seg_id
)
where isleaf = 1;
COL_A COL_B
-------------------------------------------------- ----------
Prepaid 361977
Prepaid - Voice Mobile 2687522995
Prepaid - Internet Mobile 2687525564
Prepaid - Data Mobile 2687527808
Prepaid - Voice Fixa - Default 2687531979
Prepaid - Voice Fixa - Internal PABX 2687534794
ltrim()
предназначен для удаления лишнего -
, который путь включает в начале.
Но вам нужно начальное условие; Я перешел к «Предоплате», которая включает в себя дополнительную строку в выводе, но вместо этого вы можете start with seg_id = 361978
или другое условие в зависимости от того, какие данные вы действительно хотите видеть.
Вы также можете использовать рассмотрим рекурсивный факторинг подзапросов.