Нужен запрос Oracle для спецификации IMPLOSION или спецификации "WHERE-USED" в Oracle 10g - PullRequest
1 голос
/ 31 октября 2011

Работа с БД Oracle 10g.

Мне поручено написать запрос Oracle на ВЗРЫВ БОМ, обычно известный как БОМ "ГДЕ ИСПОЛЬЗУЕТСЯ". По сути, для данного элемента или части мне нужно предоставить список родительских элементов, которые содержат этот элемент или часть, если таковые имеются.

Недавно я кодировал BOM EXPLOSION, используя следующий SQL, который использует синтаксис START WITH и CONNECT BY для создания иерархии вниз от родительского элемента. Я нашел вдохновение для запроса BOM EXPLOSION на http://www.confluentminds.com/Trainings/SCM/Topic1.1_Ch1_Part5.html

Текущий код взрыва спецификации:

/* BOM EXPLOSION */
select distinct
       level,
       sys_connect_by_path(msib.segment1, ' / ') as "PATH",
       msib2.segment1 as "CHILD ITEM AT LEVEL/PATH"
       /*bic.component_item_id,*/
       /*msib.inventory_item_id,*/
       /*msib2.inventory_item_id*/
from   bom.bom_components_b bic,
       bom.bom_structures_b bom,
       inv.mtl_system_items_b msib,
       inv.mtl_system_items_b msib2
where  1=1
       and bic.bill_sequence_id = bom.bill_sequence_id
       and bic.disable_date is null
       and bom.assembly_item_id = msib.inventory_item_id
       and bom.organization_id = msib.organization_id
       and bic.component_item_id = msib2.inventory_item_id
       and bom.organization_id = msib2.organization_id
       and bom.organization_id = #### /* organization id here */
       and bic.effectivity_date < sysdate
       and bom.alternate_bom_designator is null
start with msib.segment1 = '$$$$$$$$$$' /* top parent item here */
connect by nocycle prior bic.component_item_id = msib.inventory_item_id
order by level

Теперь мне нужно перейти от любого дочернего элемента и перечислить все родительские элементы, которые содержат этот дочерний элемент.

Я искал "oracle bom implosion" и "oracle bom, где используется", но для меня ничего не очевидно. ВЗРЫВ БОМ кажется гораздо менее простым, чем ВЗРЫВ БОМ.

Любая помощь или совет с благодарностью.

Клинт Ван Зее

РЕДАКТИРОВАТЬ 02-НОЯБРЯ-2011:

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

Основываясь на вашем ответе, я изучил отношения «соединяйся» и «начни с». Я думаю, у меня есть способ сделать это. Возможно, я был близок к ответу, не зная его.

Крейг, вот ваш макет с изменениями, добавленными, чтобы доказать это. Я также изменил «подключить» и «начать с». Он {должен!} Начинаться с дочернего компонента и идти "вверх", чтобы перечислить те модели или компоненты, которые "используют" указанный начальный компонент. Для этого я также удалил ключевое слово «prior».

with data
as
(
    select 'topmodel1' id, 'component1' child_id from dual union all
    select 'topmodel1' id, 'component3' child_id from dual union all
    select 'component2' id, 'component5' child_id from dual union all
    select 'component3' id, 'component4' child_id from dual union all
    select 'component4' id, 'component5' child_id from dual union all
    select 'component5' id, null child_id from dual union all
    select 'topmodel2' id, 'component1' child_id from dual union all
    select 'topmodel2' id, 'component5' child_id from dual union all
    select 'component5' id, null child_id from dual

)
select distinct
       sys_connect_by_path(id, '/') path, child_id, level
from data
start with child_id = 'component5'
connect by id = child_id
order by level

Это дает следующий результат:

PATH        CHILD_ID    LEVEL
----------- ----------  -----
/component2 component5  1
/component4 component5  1
/topmodel2  component5  1

Глядя на фиктивные данные, компонент 5 «используется» компонентами 2, 4 и topmodel2. Таким образом, это изменение, кажется, делает то, что я намерен. Мне пришлось добавить страшный «отчетливый», поскольку он проходил одни и те же пути более одного раза.

Я думаю, это приближает меня.

Вот минимальные изменения в моем коде BOM EXPLOSION, чтобы сделать это в обратном порядке:

START WITH msib.segment1 = '$$$$$$$$$$' /* child item here */
CONNECT BY nocycle msib.inventory_item_id = bic.component_item_id
ORDER BY level

Когда я применяю это изменение к своему сценарию SQL и пробую его на реальных данных Oracle, CBO сообщает, что затраты на поиск только одного компонента уходят в стратосферу. Итак, этот метод нуждается в настройке.

1 Ответ

0 голосов
/ 31 октября 2011

Я не уверен на 100%, что вы ищете, но похоже, что вы просто хотите взобраться на дерево, а не вниз. Это все еще возможно при использовании иерархического запроса, вам просто нужно изменить начало и подключиться по критериям.

Итак, возьмем простой пример:

with data
as
(
    select 1 id, 2 child_id from dual union all
    select 1 id, 3 child_id from dual union all
    select 2 id, 5 child_id from dual union all
    select 3 id, 4 child_id from dual union all
    select 4 id, 5 child_id from dual union all
    select 5 id, null child_id from dual
)
select sys_connect_by_path(id, '/') path, level
from data
start with id = 1
connect by prior child_id = id;

Это даст вам дочерние пути, начиная с вершины дерева. Чтобы изменить это так, чтобы оно начиналось в точке дерева и двигалось вверх, вы просто замените начало на / connect на что-то вроде:

start with id = 4 -- or wherever in the tree you want to start and move upwards
connect by prior id = child_id;

Надеюсь, это поможет. Если нет, то если бы вы могли привести пример того, что вы хотите, чтобы ваш вывод выглядел так, как это было бы очень полезно.

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