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

Откуда:
Сообщений: 148
Добрый день.

Есть датасет примерно такого вида:

with
  DS as (
    select '0100000' as Code, 'Группа 1' as Title from dual
    union all
    select '0101000' as Code, 'Группа 11' as Title from dual
    union all
    select '0101001' as Code, 'Элемент 111' as Title from dual
    union all
    select '0101002' as Code, 'Элемент 112' as Title from dual
    union all
    select '0101003' as Code, 'Элемент 113' as Title from dual
    union all
    select '0102000' as Code, 'Группа 12' as Title from dual
    union all
    select '0102001' as Code, 'Элемент 121' as Title from dual
    union all
    select '0200000' as Code, 'Группа 2' as Title from dual
    union all
    select '0201001' as Code, 'Элемент 211' as Title from dual
    union all
    select '0301001' as Code, 'Элемент 311' as Title from dual
    union all
    select '04' as Code, 'Элемент 4' as Title from dual
    union all
    select '0401' as Code, 'Элемент 41' as Title from dual
    union all
    select '555' as Code, 'Элемент 555' as Title from dual
  )  
  select * from DS



Надо построить дерево по значению поля Code. Правые нули в коде - не значимые.
В итоге должно получиться что-то вроде этого:



CODE TITLE LEVEL

0100000 Группа 1 0
0101000 Группа 11 1
0101001 Элемент 111 2
0101002 Элемент 112 2
0101003 Элемент 113 2
0102000 Группа 12 1
0102001 Элемент 121 2
0200000 Группа 2 0
0201001 Элемент 211 1
0301001 Элемент 311 1
04 Элемент 4 0
0401 Элемент 41 1
555 Элемент 555 0


Структура кода, в общем случае, будет одной длины и собрана по одним правилам, но все же хотелось бы не зависеть от нее.
Поле Level не обязательно - в результате привел для примера.

Можно ли это сделать одним запросом?
Спасибо.
13 мар 12, 10:44    [12236818]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
with
  DS as (
    select '0100000' as Code, 'Группа 1' as Title from dual
    union all
    select '0101000' as Code, 'Группа 11' as Title from dual
    union all
    select '0101001' as Code, 'Элемент 111' as Title from dual
    union all
    select '0101002' as Code, 'Элемент 112' as Title from dual
    union all
    select '0101003' as Code, 'Элемент 113' as Title from dual
    union all
    select '0102000' as Code, 'Группа 12' as Title from dual
    union all
    select '0102001' as Code, 'Элемент 121' as Title from dual
    union all
    select '0200000' as Code, 'Группа 2' as Title from dual
    union all
    select '0201001' as Code, 'Элемент 211' as Title from dual
    union all
    select '0301001' as Code, 'Элемент 311' as Title from dual
    union all
    select '04' as Code, 'Элемент 4' as Title from dual
    union all
    select '0401' as Code, 'Элемент 41' as Title from dual
    union all
    select '555' as Code, 'Элемент 555' as Title from dual
  )  
  select q.pid, q.cid, q.did , LPAD(' ', LEVEL*2) || q.TITLE as tt
  from
  (
  select substr(code,1,2) as pid,  
         substr(code,3,2) as cid,
         substr(code,5,3) as did,
         Title
  from DS
  ) q
  connect by  NOCYCLE prior pid =   pid
  ORDER BY q.pid;
13 мар 12, 11:17    [12237083]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Ramin,
очередной раз промазал. резать надо регулярками) группы разделяются незначащими нулями)
13 мар 12, 11:22    [12237138]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
MazoHist
Guest
А вдруг там 9i и регулярок нету?
13 мар 12, 11:27    [12237190]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Elic
Member

Откуда:
Сообщений: 29990
STFF Помогите с иерархическим запросом
13 мар 12, 11:28    [12237205]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Vint
Ramin,
очередной раз промазал. резать надо регулярками) группы разделяются незначащими нулями)

А кто сказал что резать надо именно регулярками? Кто то заставляет?!!!
13 мар 12, 11:37    [12237289]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Я надеюсь, что у разработчика проснётся здравый смысл, и он:

  • нормализует логическую модель данных, разделив группы и элементы в две разные сущности;
  • повторит это для физической модели, разделив таблицу как минимум на две, связанные между собой внешним ключом;
  • построит иерархию групп общепринятым способом parent_id→id.

Потому что когда-нибудь появится элемент 202. Или группа 101.
13 мар 12, 11:39    [12237310]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
KononovAI
Member

Откуда:
Сообщений: 148
suPPLer
Я надеюсь, что у разработчика проснётся здравый смысл, и он:

  • нормализует логическую модель данных, разделив группы и элементы в две разные сущности;
  • повторит это для физической модели, разделив таблицу как минимум на две, связанные между собой внешним ключом;
  • построит иерархию групп общепринятым способом parent_id→id.

Потому что когда-нибудь появится элемент 202. Или группа 101.


:)

У разработчика-то может и проснется, а вот с заказчиком сложнее...

Строки в примере абсолютно ничего не значат. Главное, в чем проблема - это разбор кода элемента и вычисление Parent-a.
Задача состоит именно в том, чтобы имеющийся "ЛИНЕЙНЫЙ" справочник показать как "ИЕРАРХИЧЕСКИЙ".

А когда будут элементы 202, то они должны свалиться в корень дерева или в элемент с кодом "20" (или "2", если "20" в списке нет).
13 мар 12, 11:49    [12237391]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
KononovAI
Member

Откуда:
Сообщений: 148
Elic
STFF Помогите с иерархическим запросом


Спасибо. В принципе уже по этому можно работать.

И сразу еще вопрос... :)

При помощи аналитической функции можно достать Parent-а?
13 мар 12, 11:50    [12237412]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Ramin,
ну раз ты быстро писатель мог бы и напейсать быстро ответ, где привести пример как ты разобьешь группы с разделителем 0)))

KononovAI
как соотносится "Правые нули в коде - не значимые" и "в элемент с кодом "20"?)) совет был дан верно. не стоит оно того геморроя который получается.
Ваш заказчик не обязан видеть внутри. ему главное чтобы "казалось" что линейный. ну так сделайте ему линейное представление, а себе нормальную структуру. sys_connect_by_path никто не отменял)
13 мар 12, 11:57    [12237468]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
KononovAI
Member

Откуда:
Сообщений: 148
KononovAI
как соотносится "Правые нули в коде - не значимые" и "в элемент с кодом "20"?)) совет был дан верно. не стоит оно того геморроя который получается.


Да, такой вариант я что-то пропустил... Спасибо.
13 мар 12, 12:01    [12237507]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
KononovAI
Member

Откуда:
Сообщений: 148
KononovAI
Ваш заказчик не обязан видеть внутри. ему главное чтобы "казалось" что линейный. ну так сделайте ему линейное представление, а себе нормальную структуру. sys_connect_by_path никто не отменял)


У заказчика как-раз есть линейный, а хочет он иерархический. Можно ему, конечно, зафиксировать структуру Code и сделать запрос с четким выделением сегментов из него. Просто думал, есть более универсальный способ.
13 мар 12, 12:03    [12237534]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Vint
Ramin,
ну раз ты быстро писатель мог бы и напейсать быстро ответ, где привести пример как ты разобьешь группы с разделителем 0)))

и где здесь группа с разделителям 0???

у автора структура:

01-01-001

автор
Структура кода, в общем случае, будет одной длины и собрана по одним правилам,


а REGEXP_SUBSTR тоже один из вариантов но не обязательный....
13 мар 12, 12:04    [12237550]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
KononovAI
А когда будут элементы 202, то они должны свалиться в корень дерева или в элемент с кодом "20" (или "2", если "20" в списке нет).

Если бы не Ваше "555" в конце примера, всё ещё было бы относительно нормально. А так — тыкайте лист в ветки:
0100000 
0101000
101
01010101 — куда?
Просто у Вас 0 не должен участвовать в нумерации групп и элементов. Иначе будет каша. Заказчик это осознаёт?

Для заказчика пусть работает интерфейс, который при отображении дерева добавит префиксом код из верхних узлов нижним.
13 мар 12, 12:05    [12237563]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
suPPLer
KononovAI
А когда будут элементы 202, то они должны свалиться в корень дерева или в элемент с кодом "20" (или "2", если "20" в списке нет).

Если бы не Ваше "555" в конце примера, всё ещё было бы относительно нормально. А так — тыкайте лист в ветки:
0100000 
0101000
101
01010101 — куда?
Просто у Вас 0 не должен участвовать в нумерации групп и элементов. Иначе будет каша. Заказчик это осознаёт?

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

как я понял у него не может быть
suPPLer
01010101 — куда?
13 мар 12, 12:06    [12237577]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
KononovAI
Member

Откуда:
Сообщений: 148
suPPLer
KononovAI
А когда будут элементы 202, то они должны свалиться в корень дерева или в элемент с кодом "20" (или "2", если "20" в списке нет).

Если бы не Ваше "555" в конце примера, всё ещё было бы относительно нормально. А так — тыкайте лист в ветки:
0100000 
0101000
101
01010101 — куда?
Просто у Вас 0 не должен участвовать в нумерации групп и элементов. Иначе будет каша. Заказчик это осознаёт?

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



Согласен. Даже на основе этого примера уже куча всяких логических неувязок. Буду решать вопрос орг.методами. Или введу жесткую фиксацию структуры номера.

Спасибо всем за помощь.
13 мар 12, 12:17    [12237681]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ramin
и где здесь группа с разделителям 0???

у автора структура:

01-01-001

Ramin
как я понял у него не может быть

Да уж, структура деревянная и однозначная... Вы плохо поняли:
KononovAI
04      Элемент 4                   0
0401 Элемент 41 1
555 Элемент 555 0


ТС, Вы не забывайте, что заказчик говорит, что и как он хочет видеть и делать. Как и что будет на самом деле в структурах БД, коде, модулях — не его дело. Он за это и деньги платит.
13 мар 12, 12:18    [12237687]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
suPPLer
Ramin
и где здесь группа с разделителям 0???

у автора структура:

01-01-001

Ramin
как я понял у него не может быть

Да уж, структура деревянная и однозначная... Вы плохо поняли:
KononovAI
04      Элемент 4                   0
0401 Элемент 41 1
555 Элемент 555 0


ТС, Вы не забывайте, что заказчик говорит, что и как он хочет видеть и делать. Как и что будет на самом деле в структурах БД, коде, модулях — не его дело. Он за это и деньги платит.

Да блин упустил "555"
13 мар 12, 12:25    [12237766]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
KononovAI
Member

Откуда:
Сообщений: 148
suPPLer
ТС, Вы не забывайте, что заказчик говорит, что и как он хочет видеть и делать. Как и что будет на самом деле в структурах БД, коде, модулях — не его дело. Он за это и деньги платит.


Это точно.
Просто эта задача показалась интересной...
13 мар 12, 12:27    [12237779]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
suPPLer
Если бы не Ваше "555" в конце примера, всё ещё было бы относительно нормально.

555 как раз не проблема, и разбить строку на родитель-потомок без регэкспов не мешает.
Вот с
0200000	Группа 2                    0
0201001 Элемент 211 1
0301001 Элемент 311 1
сложнее
13 мар 12, 15:38    [12240024]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Сергей Арсеньев
suPPLer
Если бы не Ваше "555" в конце примера, всё ещё было бы относительно нормально.

555 как раз не проблема, и разбить строку на родитель-потомок без регэкспов не мешает.


Разбейте:
101
13 мар 12, 15:41    [12240057]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
suPPLer,

гы разбил - это единственная строка => она верх иерархии. :)
13 мар 12, 15:49    [12240135]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Elic
Member

Откуда:
Сообщений: 29990
Сергей Арсеньев
это единственная строка => она верх иерархии. :)
Тогда 0301001 ничуть не сложнее, ибо тоже.
13 мар 12, 15:51    [12240165]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Сергей Арсеньев
suPPLer,

гы разбил - это единственная строка => она верх иерархии. :)

01
101
101 -- это верхняя группа 101 или подгруппа 11 группы 1? Учитывая, что нули как начала групп и пары разрядов не обязательны ("555").

Даже в примере каша. Воплощать её в БД было бы интересно, но недальновидно.
13 мар 12, 16:10    [12240408]     Ответить | Цитировать Сообщить модератору
 Re: Собрать иерархию по коду запросом  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
suPPLer
01
101

Согласно условиям задачи обязательно надо сделать rtrim(code,'0') tc.
Обязательность ltrim не декларирована (но также может использоваться если надо).

А дальше финт ушами - selfjoin на d1.tc like d2.tc||'%' с отбором того "предка", номер которого длиннее.

Но для вхождения 03 в 02 этот алгоритм работать не будет. :(
13 мар 12, 18:27    [12242049]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить