Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abfrage auf hierarchische Tabellenstruktur

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von gente, 9 Juli 2014.

  1. gente

    gente Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
  3. ukulele

    ukulele Datenbank-Guru

    Walter und gente gefällt das.
  4. gente

    gente Benutzer

    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.
     
  5. ukulele

    ukulele Datenbank-Guru

    Joa aber das sollte alles machbar sein, kriegt man nur schnell Knoten im Kopf.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden