In PostgreSQL worden recursieve zoekopdrachten geconstrueerd door eerst de initiële . op te geven reeks rijen (de niet-recursieve term , d.w.z. die op het hoofd- of eindniveau van de hiërarchie). Daaropvolgende iteraties (over de recursieve term , de subquery na de UNION ALL
) voeg vervolgens rijen toe aan de resultatenset van de resterende rijen in de invoerrijenset totdat er geen rijen meer worden toegevoegd.
In uw geval is de initiële subquery niet gefilterd, dus u voegt eenvoudig alle rijen toe tijdens de eerste uitvoering, zodat er niets overblijft voor volgende uitvoeringen.
Probeer het volgende:
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;