Müssen für Oracle-Abfragen für eine Stückliste IMPLOSION oder BOM "WO-VERWENDET" auf Oracle 10g

Arbeiten mit Oracle DB 10g.

Ich bin beauftragt mit dem schreiben einer Oracle-query für eine Stückliste, IMPLOSION, allgemein bekannt als BOM "WO-VERWENDET". Im wesentlichen, gegeben ein Element oder ein Teil brauche ich, um eine Liste der übergeordneten Elemente enthalten das Element oder Teil, wenn überhaupt.

Ich habe vor kurzem codiert eine Stücklistenauflösung mit dem folgenden SQL-was nutzt den START und CONNECT BY-syntax zu erstellen, bietet nach unten von einem übergeordneten Element. Ich fand inspiration für die Stücklistenauflösung Abfrage bei http://www.confluentminds.com/Trainings/SCM/Topic1.1_Ch1_Part5.html

Iststücklistenauflösung code:

/* 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

Nun, ich muss gehen von jedem Kind Element und Liste alle übergeordneten Elemente enthalten, die untergeordnete Element.

Suchte ich nach "oracle bom implosion" und "oracle bom, wo verwendet", aber nichts ist für mich offensichtlich. Die Stückliste IMPLOSION scheint weit weniger einfach, als die Stücklistenauflösung.

Jede Hilfe oder Beratung wird sehr geschätzt.

Clint Van Zee

BEARBEITEN 02-NOV-2011:

Ja, ich will zu Durchlaufen, bis eine Stückliste bietet und Liste diese Elemente oder Komponenten, von denen eine angegebene Komponente verwendet wird, in Rechnung stellen.

Basierend auf Ihre Antwort, sah ich in der "connect by" - Beziehung und "beginnen mit". Ich denke ich habe einen Weg, dies zu tun. Ich kann seit knapp die Antwort ohne es zu wissen.

Craig, hier ist Ihre mock-up mit Modifikationen Hinzugefügt, um dies zu beweisen aus. Ich auch verändert, das "verbinden mit" und "beginnen mit". Es {sollte!} beginnen Sie mit der untergeordneten Komponente und gehen Sie "nach oben", um eine Liste dieser Modelle oder Komponenten, die die "Verwendung" der angegebene ab-Komponente. Um dies zu tun, ich habe auch entfernt die "vor" - Schlüsselwort.

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

Dies führt zu folgendem Ergebnis:

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

Blick auf das mock-Daten, Komponente 5 ist "durch" component2, component4, und topmodel2. Also, diese änderung scheint zu tun, was ich vorhabe. Ich hatte, um die gefürchteten "distinct", wie es war, Durchlaufen die gleichen Pfade mehr als einmal.

Ich denke, das ist mir immer näher.

Hier sind die minimalen änderungen an meinem Stücklistenauflösung code zu tun in umgekehrter Richtung:

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

Wenn ich diese änderung an meinem SQL-Skript und probieren Sie es gegen die eigentlichen Oracle-Daten die CBO berichtet, dass die Kosten für die Suche nur eine Komponente in der Stratosphäre. So, diese Methode braucht tuning.

  • Bitte nicht versuchen, zu Kommentar auf eine Antwort von ihn Bearbeiten - entweder Kommentar, hinzufügen von Informationen zu Ihrer Frage, oder posten Sie eine eigene Antwort (wenn es wirklich eine Antwort und nicht auf zusätzliche Informationen oder Kommentare in Bezug auf eine andere Antwort).
  • Ich entschuldige mich. Ich weiß nicht, ob es war ein "Antwort" so viel, wie eine Veränderung in meiner Sicht, basierend auf Craig ' s Informationen. Für was es Wert ist, dies ist mein erstes posting auf stackoverflow und ich wollte nicht sehen, wie ich hinzufügen könnte eine langwierige update darauf hingewiesen, dass Craig. Ich werde meine original-posting für lange Bearbeitungen von nun an.
InformationsquelleAutor Clint V. | 2011-10-31
Schreibe einen Kommentar