I PostgreSQL konstrueras rekursiva frågor genom att först specificera initial uppsättning rader (den icke-rekursiva termen t.ex. de på rot- eller slutnivån i hierarkin). Efterföljande iterationer (över den rekursiva termen , underfrågan efter UNION ALL
) lägg sedan till rader till resultatuppsättningen från de återstående raderna i inmatningsraduppsättningen tills inga fler rader läggs till.
I ditt fall är den initiala underfrågan ofiltrerad så att du helt enkelt lägger till alla rader i den första körningen, utan att lämna något för efterföljande körningar.
Prova följande:
WITH RECURSIVE q AS (
SELECT po.catalog_id,po.sub_tree_id
FROM my_catalog po
WHERE sub_tree_id = 0 -- this initially selects only "root" rows
UNION ALL
SELECT po.catalog_id,po.sub_tree_id
FROM my_catalog po
JOIN q ON q.catalog_id=po.sub_tree_id
)
SELECT * FROM q;