Announcement

Collapse
No announcement yet.

Rekursive Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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:
    [highlight=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'
    [/highlight]
    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! ):
    [highlight=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'
    [/highlight]
    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
    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.


    Comment


    • #3
      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

      Comment


      • #4
        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

        Comment


        • #5
          @arne drews

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

          Comment


          • #6
            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:
            [highlight=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'[/highlight]So erhalte ich wie gewünscht alle Elemente aller Ebenen einer Stückliste.
            PHP rocks!
            Eine Initiative der PHP Community

            Comment

            Working...
            X