Работа с БД 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 сообщает, что затраты на поиск только одного компонента уходят в стратосферу. Итак, этот метод нуждается в настройке.