В PostgreSQL рекурсивните заявки се конструират, като първо се посочи началното набор от редове (нерекурсивен термин , т.е. тези в корена или крайното ниво на йерархията). Последващи повторения (над рекурсивния термин , подзаявката след UNION ALL
) след това добавете редове към набора с резултати от останалите редове във входния набор от редове докато не се добавят повече редове.
Във вашия случай първоначалната подзаявка е нефилтрирана, така че просто добавяте всички редове при първоначалното изпълнение, без да оставяте нищо за следващите изпълнения.
Опитайте следното:
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;