Abfrage auf hierarchische Tabellenstruktur

gente

Benutzer
Beiträge
10
Hallo an das Forum erstmal!

Ich habe ein kleines Problem und hoffe ihr könnt mir hier vielleicht den einen oder andere Denkanstoß geben. Vor mir liegt eine Tabelle in der Stücklistendaten hierarchisch angelegt sind. Siehe Tabelle.

(Range 1xx-Produkt;2xx-Halbzeug;3xx-Rohstoff)

Tabelle.JPG

Löst man die Hierarchie nach Stückliste 100 aus würde es ca. so aussehen:

stüli100.JPG

Gefragt ist nun eine Art Teilenachweis. D.h. eine Query die auflöst wie oft ein Bauteil in welchem Typ enthalten ist und genau hier stoße ich an meine Grenzen.

Anbei ein Beispielergebnis:

abfrage.JPG

Es ist natürlich kein Problem erstmal nach XXX abzufragen, schwieriger wird es da schon die Wurzel zu finden bzw. auf dem Weg dahin alle Multiplikationen abzufangen (es kann ein Halbzeug (200) ja mehrmals verbaut werden).

Meine bis jetzt erdachte Lösungsvariante:

Einfache Abfrage über die Rohstoffe und speichern des Ergebnisses in einer temporären Tabelle, anschließend läuft ein rekursiver Query über die Zwischenergebnisse der die Wurzel sucht und die Mengen entsprechend addiert - die Entwicklung des ganzen wird wohl doch etwas aufwendiger deshalb meine Frage an euch: Übersehe ich hier etwas oder wie würdet ihr das Problem angehen?
 
Werbung:
Hallo an das Forum erstmal!

Ich habe ein kleines Problem und hoffe ihr könnt mir hier vielleicht den einen oder andere Denkanstoß geben. Vor mir liegt eine Tabelle in der Stücklistendaten hierarchisch angelegt sind. Siehe Tabelle.

Das geht mit rekursiven Abfragen, was wohl auch M$SQL kann, in PostgreSQL so:

Code:
test=*# select * from gente ;
 typ | nr  |  b  | menge
-----+-----+-----+-------
 100 | 300 | xxx |  1
 100 | 301 | yyy |  1
 100 | 200 | aaa |  1
 200 | 302 | zzz |  2
 201 | 301 | yyy |  2
 201 | 300 | xxx |  1
 101 | 303 | www |  1
 101 | 301 | yyy |  1
 101 | 200 | aaa |  1
 102 | 304 | vvv |  1
 102 | 300 | xxx |  2
 200 | 300 | bbb |  1
 200 | 201 | bbb |  1
(13 rows)

test=*# with recursive teile (typ,nr,b,menge) as (select typ, nr, b, menge from gente where typ=100 union all select p.typ, p.nr, p.b, p.menge from teile t, gente p where p.typ=t.nr) select * from teile;
 typ | nr  |  b  | menge
-----+-----+-----+-------
 100 | 300 | xxx |  1
 100 | 301 | yyy |  1
 100 | 200 | aaa |  1
 200 | 302 | zzz |  2
 200 | 300 | bbb |  1
 200 | 201 | bbb |  1
 201 | 301 | yyy |  2
 201 | 300 | xxx |  1
(8 rows)
 
Vielen Dank Ukulele - ist genau der richtige Artikel und sollte sich so anwenden lassen - dann muss ich nur noch zusehen das ich das Aggregat über die Menge pro Produkt zusammenbekomme. Es kann ja Teil XXX mehrmals verbaut sein je Halbzeug und das Halbzeug wiederum mehrmals verbaut werden je Produkt.

Der einzige Unterschied vom Beispiel zu unserer DB: die Wurzel selbst wird hier in einer eigenen Tabelle behandelt, d.h. es wäre keine Abfrage auf NULL möglich um eine Wurzel zu identifizieren.
 
Werbung:
Zurück
Oben