Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 База кладр (алгорит для вычисления значения parentfield)  [new]
незнайка...
Guest
Используя данные из программы кладр собираюсь построить дерево. для построение необходимо вычислить значение id родительской записи.
Что бы получилось как- то вот так:
id значение id родителя
7600000000000
76001000000007600000000000
76002000000007600000000000
76006000000007600000000000
76007000000007600000000000
76008000000007600000000000
76009000000007600000000000
76010000000007601000000000
76011000000007601000000000
76016000000007601000000000
76017000000007601000000000
76000001000007600000000000
76000002000007600000000000
76002000205007600200020000
76002000206007600200020000
76002000207007600200020000


подскажите алгоритм вычисление данного id сам логически сформулировать не могу: вся трудность втом что к примеру
id 7600100000000 должно иметь родителя с id 7600000000000, также
id 7600000100000 должно иметь родителя с id 7600000000000, в то время как
id 7600200020500 должно иметь родителя с id 7600200020000.

id= СС РРР ГГГГ ППП АА ; СС- субъект РФ, РРР- район, ГГГ город, ППП- насл пункт, АА - актуальность.

заранее признателен за помощь.
13 янв 09, 15:36    [6679185]     Ответить | Цитировать Сообщить модератору
 Re: База кладр (алгорит для вычисления значения parentfield)  [new]
Глова Сергей
Member

Откуда: Киев
Сообщений: 37
незнайка...,

Ну функция по вычислению родителя по ID элементарна
1. Начать движение по блокам ID справа налево. ППП-ГГГ-РРР ...
2. Найти первый ненулевой блок.
3. Обнулить данный блок. - получим родительский ID.

Поправьте, если я Вас неправильно понял
13 янв 09, 15:47    [6679299]     Ответить | Цитировать Сообщить модератору
 Re: База кладр (алгорит для вычисления значения parentfield)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
КЛАДР - это классификатор, а не иерархия.
Поэтому все тривиально:
with tab as(
select '7600000000000' id, '' parent
from dual union all select '7600100000000', '7600000000000'
from dual union all select '7600200000000', '7600000000000'
from dual union all select '7600600000000', '7600000000000'
from dual union all select '7600700000000', '7600000000000'
from dual union all select '7600800000000', '7600000000000'
from dual union all select '7600900000000', '7600000000000'
from dual union all select '7601000000000', '7601000000000'
from dual union all select '7601010000000', '7601000000000'
from dual union all select '7601060000000', '7601000000000'
from dual union all select '7601070000000', '7601000000000'
from dual union all select '7600000100000', '7600000000000'
from dual union all select '7600000200000', '7600000000000'
from dual union all select '7600200020500', '7600200020000'
from dual union all select '7600200020600', '7600200020000'
from dual union all select '7600200020700', '7600200020000'
from dual
)
select t.*
     , case
       when length(rtrim(id,'0')) <=2 then ''
       when length(rtrim(id,'0')) <=5 then rpad(substr(id,1,2),13,'0')
       when length(rtrim(id,'0')) <=8 then rpad(substr(id,1,5),13,'0')
       when length(rtrim(id,'0')) <=11 then rpad(substr(id,1,9),13,'0')
       else rpad(substr(id,1,11),13,'0')
       end kladr_parent
from tab t;
 
ID            PARENT        KLADR_PARENT
------------- ------------- ---------------------------------------
7600000000000               
7600100000000 7600000000000 7600000000000
7600200000000 7600000000000 7600000000000
7600600000000 7600000000000 7600000000000
7600700000000 7600000000000 7600000000000
7600800000000 7600000000000 7600000000000
7600900000000 7600000000000 7600000000000
7601000000000 7601000000000 7600000000000
7601010000000 7601000000000 7601000000000
7601060000000 7601000000000 7601000000000
7601070000000 7601000000000 7601000000000
7600000100000 7600000000000 7600000000000
7600000200000 7600000000000 7600000000000
7600200020500 7600200020000 7600200020000
7600200020600 7600200020000 7600200020000
7600200020700 7600200020000 7600200020000
 
16 rows selected
 
SQL> 
13 янв 09, 15:51    [6679336]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить