CONNECT BY PRIOR и объединение родительско-дочерней иерархии - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть эта таблица:

img

Желаемый результат:

img

Что я пытаюсь:

select SEG from my_table CONNECT BY PRIOR PARENT_SEG_ID = SEG_ID;

Итак, в столбце LEVEL_LOCATOR мы видим, что УРОВЕНЬ 5.9 имеет 6 детей, а 5.9.4 - 2 ребенка. И, например, родителем дочернего элемента 5.9.1 является Postpaid, который имеет SEG_ID = 361978, и он находится в строке этого дочернего элемента как PARENT_SEG_ID. Итак, родитель и потомок соединяются с SEG_ID и PARENT_SEG_ID.

Я пытаюсь сделать это, но пока не могу получить желаемый результат.

Примечание: Col_a - это столбец конкатенации SEG в следующем формате: parent - child - child (если у него есть дочерние элементы)

1 Ответ

2 голосов
/ 10 февраля 2020

Я думаю, что вам нужно пройтись по дереву с другой стороны, и затем можно использовать 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 или другое условие в зависимости от того, какие данные вы действительно хотите видеть.

Вы также можете использовать рассмотрим рекурсивный факторинг подзапросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...