V PostgreSQL se rekurzivní dotazy konstruují tak, že nejprve zadáte počáteční sada řádků (nerekurzivní výraz , tj. ty na kořenové nebo konečné úrovni hierarchie). Následné iterace (přes rekurzivní výraz , dílčí dotaz za UNION ALL
) pak přidejte řádky do sady výsledků ze zbývajících řádků v sadě vstupních řádků dokud nebudou přidány žádné další řádky.
Ve vašem případě je počáteční dílčí dotaz nefiltrovaný, takže jednoduše přidáte všechny řádky při počátečním spuštění a pro další spuštění nezůstane nic.
Zkuste následující:
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;