Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 6 von 6
  1. #1
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    308

    Standard Rekursive Abfrage

    Hallo,

    Ich habe ein kleines Problem mit rekursiven Abfragen.


    Ausgangssituation:
    Ich habe Artikel, die vom Typ her eine Stückliste sind, also weitere Artikel als Elemente enthalten.
    Stücklisten haben allerdings keinen LEK ( letzten EK ), den wir aber zwecks Analysen benötigen. Nun hatte ich die Idee, die LEKs der Elemente in einer Stückliste summieren:
    Code SQL:
    SELECT
        SUM(varianten.LetzterEK * stckliste.Menge) LEK
    FROM
         ArtikelStueckliste stckliste
    JOIN
         ArtikelVarianten varianten
        ON varianten.Artikelnummer = stckliste.Element
        AND varianten.auspraegungID = stckliste.AuspraegungID
        AND varianten.Mandant = stckliste.Mandant
    WHERE
        stckliste.Stueckliste = '0815'
    Damit bekomme ich schon mal den errechneten LEK der Stückliste 0815.


    Das Problem:
    Nun gibt es allerdings Stücklisten, die als Element weitere Stücklisten haben, weswegen ich zur Rekursion komme.
    Da ich mich zum ersten mal damit befasse, hakt es natürlich an einigen Ecken.

    Ich habe bspw. mal folgendes probiert ( erstmal ohne Bezug auf den Preis! ):
    Code SQL:
    ;WITH cte AS (
     
        SELECT a.Stueckliste, a.Element, a.Menge FROM artikelstueckliste a
        UNION ALL
        SELECT b.Stueckliste, b.Element, b.Menge FROM cte JOIN ArtikelStueckliste b ON cte.element = b.stueckliste
     
    )
     
    SELECT * FROM cte WHERE stueckliste = '0816'
    Hier bekomme ich allerdings nur die zwei Elemente der Stückliste 0816. Diese beiden ( nennen wir sie mal 0817 und 0818 ) sind selbst aber auch Stücklisten.
    Mein Ziel ist es nun, auch die Elemente von 0817 und 0818 zu erhalten.

    Muss ich da komplett umdenken oder kann man das vorhandene ausbauen?

    Danke
    Arne
    PHP rocks!
    Eine Initiative der PHP Community

  2. #2
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.780

    Standard

    Ich rate das du eigentlich nicht b.Stueckliste in der cte zurückgeben solltest sondern cte.Stueckliste.
    Denn du willst ja nur über die
    Stueckliste(nbezeichnung) des Wurzelelementes, oder wie man das auch immer nennen möchte, filtern.



  3. #3
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.199

    Standard

    Ich denke mit with bist Du nahe dran. Hier ist ein gutes Beispiel mit kurzer Erläuterung.
    http://stackoverflow.com/questions/9...-in-sql-server
    Gruß, defo

  4. #4
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    308

    Standard

    Hallo,

    Danke @Ralf, Du hast recht, das war mein Fehler.
    Auch Dir danke, @defo. Die machen das ein wenig anders, aber das hätte evtl. auch zum Ziel geführt.

    Schönen Abend
    Arne
    PHP rocks!
    Eine Initiative der PHP Community

  5. #5
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.199

    Standard

    @arne drews

    Lass uns und die Leser nicht dumm sterben und zeig doch bitte die Lösung.
    Gruß, defo

  6. #6
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    308

    Standard

    Ach so 'tschuldigung, ich dachte das war klar...

    Ich habe wie von Ralf bemerkt das falsche Feld zurückgegeben. In der Query nach dem Union musste ich anstatt b.Stueckliste nur cte.Stueckliste ausliefern:
    Code SQL:
    ;WITH cte AS (
     
        SELECT a.Stueckliste, a.Element, a.Menge FROM artikelstueckliste a
        UNION ALL
        SELECT cte.Stueckliste, b.Element, b.Menge FROM cte JOIN ArtikelStueckliste b ON cte.element = b.stueckliste
     
    )
     
    SELECT * FROM cte WHERE stueckliste = '0816'
    So erhalte ich wie gewünscht alle Elemente aller Ebenen einer Stückliste.
    PHP rocks!
    Eine Initiative der PHP Community

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •