I PostgreSQL konstrueres rekursive forespørgsler ved først at angive initial sæt rækker (det ikke-rekursive udtryk , dvs. dem på rod- eller sidste niveau af hierarkiet). Efterfølgende iterationer (over den rekursive term , underforespørgslen efter UNION ALL
) tilføj derefter rækker til resultatsættet fra de resterende rækker i inputrækkesættet indtil der ikke tilføjes flere rækker.
I dit tilfælde er den indledende underforespørgsel ufiltreret, så du tilføjer simpelthen alle rækker på den indledende kørsel, uden at efterlade noget til efterfølgende kørsler.
Prøv følgende:
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;