2016-11-17 2 views
2

Ich habe eine kurze Frage zu Postgres SQL.Rekursive Liste von Unterprodukten in Postgres SQL

Mein Ziel ist ein Produkt Tabelle, wo wir 1 oder mehrere Elternprodukte und dann bestimmte Kinderprodukte haben.

product schema

In einer anderen Tabelle Umsatz ich nur den Verkauf eines bestimmten Produkts setzen.

sales schema

Nun zu meiner SQL:

Ich möchte bascially alle Verkäufe pro superparent Produkt abzurufen, in meinem Beispiel mobile und zu Hause mit der Summe der Verkäufe aus den Unterprodukten.

My SQL bisher:

WITH RECURSIVE assignDepth (id, depth, parent) AS (
    SELECT p.id, 0 as depth, p.parent 
    FROM product p 
    WHERE p.parent IS NULL 
    UNION ALL 
    SELECT p.id, c.depth+1, p.parent 
    FROM product p, assignDepth c 
    WHERE p.parent = c.id 
), 
    getProductValue (id, name, value, parent) AS (
    SELECT p.id, p.name, 0 as value, p.parent 
    FROM product p, 
    WHERE p.depth = (SELECT MAX(depth) FROM assignDepth) 
    UNION ALL 
     SELECT p.id, p.name,SUM(
      SELECT s.value 
      FROM sales s 
      WHERE c.id = s.product), p.parent 
    FROM product p, getProductValue c 
    WHERE p.id = c.parent 
) 
SELECT * FROM getProductValue; 

Vielen Dank im Voraus, wird jede Hilfe dankbar! :)

Antwort

0

Ich löste es von mir selbst mit nur einer Rekursion.

WITH RECURSIVE getProductValue (i, n, par) AS 
(SELECT id as i, name as n, id as par FROM product 
    UNION all 
     SELECT product.id AS i, product.name AS n, getProductValue.par 
     FROM product, getProductValue 
     WHERE product.parent=getProductValue.i) 
SELECT par, SUM(value) 
FROM getProductValue, sales 
WHERE par<>i 
AND sales.product=getProductValue.i 
GROUP by par; 

Das ist die Lösung, wenn jemand interessiert ist!