Rekursiv sich nach oben arbeiten

fohnbit

Benutzer
Beiträge
21
Hallo,

ich hänge im Moment an einer Query:
Ich habe Tabelle A:
categ_id;discount
1;10
2;10
5;20


Und habe die Tabelle B:
id;product_name;parent_categ_id;categ_id
34;ProduktA;3;4

Kategorenaufbau in etwa:
1
2
3
4
5
6​

Ein Produkt liegt in der Kategorie "4" .. die Preisliste ist aber für Kategorie "2" gesetzt (was alles drunter betrifft, sofern darunter nicht ein neuer Discount gesetzt ist).
Nun muss ich vom Produkt ausgehen immer mit der "parent_categ_id" mich nach oben arbeiten, bis ich einen Treffer in der Tabelle A bei "categ_id" erhalte und dann den "discount" ausgeben.

Beim Beispiel muss ich "10" zurück bekommen.

Klappt das mit einer Query?
 
Werbung:
ja, sollte klappen. Auch M$SQL kann rekursive Abfragen, ich habe in den letzten Jahren schon mehrfach rekursive Abfragen mit PostgreSQL hier gezeigt (WITH RECURSIVE ...)

Andreas
 
Also erstmal ja, das geht mit WITH.

Ich verstehe aber den Zusammenhang noch nicht ganz. Wenn der Datensatz in B categ_id 4 hat ist das erstmal einleuchtend. 4 würde ich aber nicht als parent_categ_id 3 sondern 2 sehen, das ist doch eigentlich mit 3 auf der selben Ebene unter 2 oder ist das nur verrutscht?

Nur zur Klarstellung: Wenn da 10 raus kommen soll dann weil 2 die erste Ebene ist zu der eine Preisliste existiert (also Datensatz 2;10 oder weil 1 die Höchste Kategorie ist und dann deren Preisliste gilt?
 
Werbung:
Würde in etwa so aussehen:
Code:
WITH t AS (
   SELECT   b1.id,
           b1.parent_categ_id,
           b1.categ_id,
           a1.discount
   FROM   tabelle_B b1
   LEFT JOIN tabelle_A a1
   ON       b1.categ_id = a1.categ_id
   WHERE   b1.id = 34
   UNION ALL
   SELECT   t.id,
           b2.parent_categ_id,
           b2.categ_id
   FROM   t
   INNER JOIN tabelle_B b2
   ON       t.parent_categ_id = b2.categ_id
   LEFT JOIN tabelle_A a2
   ON       b2.categ_id = a2.categ_id
   WHERE   t.discount IS NULL
   )
SELECT   *
FROM   t
WHERE   t.discount IS NOT NULL
 
Zurück
Oben