In PostgreSQL le query ricorsive vengono costruite specificando prima l'iniziale insieme di righe (il termine non ricorsivo , cioè quelli alla radice o al livello finale della gerarchia). Iterazioni successive (sul termine ricorsivo , la sottoquery dopo UNION ALL
) quindi aggiungi le righe al set di risultati dalle righe rimanenti nel set di righe di input fino a quando non vengono aggiunte altre righe.
Nel tuo caso, la sottoquery iniziale non è filtrata, quindi aggiungi semplicemente tutte le righe nell'esecuzione iniziale, senza lasciare nulla per le esecuzioni successive.
Prova quanto segue:
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;