Получение нумерации контуров на основе СОЕДИНЕНИЯ ПО иерархии

#sql #oracle #hierarchy

Вопрос:

Я хочу создать автоматически пронумерованный контур на основе результата запроса CONNECT BY.

ЕСЛИ результаты моего запроса будут следующими:

 level col1
----- --------
1     text1
1     text2
2     text3
3     text4
3     text5
1     text6
 

Я заинтересован в получении числовых значений иерархии следующим образом:

 level outline col1
----- ------- --------
1     1       text1
1     2       text2
2     2.1     text3
3     2.1.1   text4
3     2.1.2   text5
1     3       text6
 

это похоже sys_connect_by_path на окно или окно lag — но я его не вижу…

Комментарии:

1. Как выглядит ваш вклад? (Это также сэкономит нам время на создание тестовых данных.)

Ответ №1:

Вы не предоставили тестовые данные, поэтому вместо этого я проиллюстрирую их в scott.emp таблице.

 select  level,
        substr(sys_connect_by_path(rn, '.'), 2) as outline,
        empno
from    (
          select empno, mgr,
                 row_number() over (partition by mgr order by empno) as rn
          from   scott.emp
        )
start   with mgr is null
connect by mgr = prior empno
order   siblings by empno
;

LEVEL OUTLINE        EMPNO
----- -------------- -----
    1 1               7839
    2 1.1             7566
    3 1.1.1           7788
    4 1.1.1.1         7876
    3 1.1.2           7902
    4 1.1.2.1         7369
    2 1.2             7698
    3 1.2.1           7499
    3 1.2.2           7521
    3 1.2.3           7654
    3 1.2.4           7844
    3 1.2.5           7900
    2 1.3             7782
    3 1.3.1           7934
 

В подзапросе мы даем порядковый номер «братьям и сестрам» (строкам/сотрудникам, у которых один и тот же прямой родитель), и мы используем его в sys_connect_by_path . Чтобы получить «правильный» порядок из иерархического запроса, вам нужно упорядочить братьев и сестер так же, как вы упорядочили их в подзапросе (в моем случае по empno , что является первичным ключом; в вашем случае, если col1 могут быть дубликаты, упорядочьте по col1, rowid в обоих местах, чтобы разорвать связи).

Комментарии:

1. Это сделало свое дело. спасибо, что расчистил мое препятствие 🙂