Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как пронумеровать элементы дерева?  [new]
Amberit
Member

Откуда: Киев
Сообщений: 765
Здравствуйте, уважаемые форумчане!

Помогите, пожалуйста, решить одну задачку. Имеется древовидный запрос:

SELECT id, parent_id, txt
FROM table
CONNECT BY parent_id = PRIOR id
START WITH parent_id IS NULL

В результате выводится некое дерево. Имеется задание: пронумеровать элементы дерева, например:

1. Товары.
1.1. Продовольственные товары.
1.1.1. Мука.
1.1.2. Картошка.
1.2. Непродовольственные товары.
1.2.1. Стиральный порошок.
1.2.1.1. Тайд.
1.2.1.2. Ариэль.
1.2.2. Полироль для мебели.
1.3. Другое.
2. Услуги.
2.1. Почтовые услуги.
2.2. Банковские услуги.
...

Как проставить номера? Уважаемые коллеги, очень надеюсь на Вашу помощь, так как данную проблему решить самостоятельно не могу. Заранее спасибо! ;-)
27 апр 06, 00:21    [2607425]     Ответить | Цитировать Сообщить модератору
 Re: Как пронумеровать элементы дерева?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116250
Возможно это велосипед, причем усложненный, но получилось :)

Данные
with tabl
as
(select 1 id, NULL parent_id, 'Товары.' Name
 from dual
 union all
select 10 id, 1 parent_id, 'Продовольственные товары.' Name
 from dual
 union all
select 100 id, 10 parent_id, 'Мука.' Name
 from dual
 union all
select 200 id, 10 parent_id, 'Картошка.' Name
 from dual
 union all
select 20 id, 1 parent_id, 'Непродовольственные товары.' Name
 from dual
 union all
select 300 id, 20 parent_id, 'Стиральный порошок.' Name
 from dual
 union all
select 1000 id, 300 parent_id, 'Тайд.' Name
 from dual
 union all
select 2000 id, 300 parent_id, 'Ариэль.' Name
 from dual
 union all
select 400 id, 20 parent_id, 'Полироль для мебели.' Name
 from dual
 union all
select 30 id, 1 parent_id, 'Другое.' Name
 from dual
 union all
select 2 id, NULL parent_id, 'Услуги.' Name
 from dual
 union all
select 40 id, 2 parent_id, 'Почтовые услуги.' Name
 from dual
 union all
select 50 id, 2 parent_id, 'Банковские услуги' Name
 from dual
)

SELECT name, substr(sys_connect_by_path(rn,'.'),2)
from
(SELECT id, parent_id, name , row_number() over(partition by parent_id,level order by id) rn 
FROM tabl 
CONNECT BY PRIOR id = parent_id
START WITH parent_id IS NULL
)
CONNECT BY PRIOR id = parent_id
START WITH parent_id IS NULL

NAME SUBSTR(SYS_CONNECT_BY_PATH(RN,'.'),2) 
Товары. 1 
Продовольственные товары. 1.1 
Мука. 1.1.1 
Картошка. 1.1.2 
Непродовольственные товары. 1.2 
Стиральный порошок. 1.2.1 
Тайд. 1.2.1.1 
Ариэль. 1.2.1.2 
Полироль для мебели. 1.2.2 
Другое. 1.3 
Услуги. 2 
Почтовые услуги. 2.1 
Банковские услуги 2.2 

Мне не нравится двойной проход по дереву, но не знаю, как избежать ...
27 апр 06, 01:27    [2607505]     Ответить | Цитировать Сообщить модератору
 Re: Как пронумеровать элементы дерева?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
dmidek
Мне не нравится двойной проход по дереву, но не знаю, как избежать ...


SQL> column sub_num format a10
SQL> SELECT  LTRIM(SYS_CONNECT_BY_PATH(RN,'.'),'.') SUB_NUM,
  2          ename,
  3          job
  4    FROM  (
  5           SELECT  e.*,
  6                   ROW_NUMBER() OVER (PARTITION BY mgr  ORDER BY ename) rn
  7             FROM  emp e
  8          )
  9    START WITH mgr is NULL
 10    CONNECT BY PRIOR empno = mgr
 11    ORDER SIBLINGS BY ename
 12  /

SUB_NUM    ENAME      JOB
---------- ---------- ---------
1          KING       PRESIDENT
1.1        BLAKE      MANAGER
1.1.1      ALLEN      SALESMAN
1.1.2      JAMES      CLERK
1.1.3      MARTIN     SALESMAN
1.1.4      TURNER     SALESMAN
1.1.5      WARD       SALESMAN
1.2        CLARK      MANAGER
1.2.1      MILLER     CLERK
1.3        JONES      MANAGER
1.3.1      FORD       ANALYST

SUB_NUM    ENAME      JOB
---------- ---------- ---------
1.3.1.1    SMITH      CLERK
1.3.2      SCOTT      ANALYST
1.3.2.1    ADAMS      CLERK

14 rows selected.

SQL> 

SY.
27 апр 06, 03:56    [2607547]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить