#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. Это сделало свое дело. спасибо, что расчистил мое препятствие 🙂