W PostgreSQL zapytania rekurencyjne są konstruowane przez określenie początkowego zestaw wierszy (termin nierekurencyjny , czyli tych na głównym lub ostatnim poziomie hierarchii). Kolejne iteracje (nad okresem rekurencyjnym , podzapytanie po UNION ALL
), a następnie dodaj wiersze do zestawu wyników z pozostałych wierszy w zestawie wejściowym dopóki nie zostaną dodane żadne wiersze.
W Twoim przypadku początkowe podzapytanie nie jest filtrowane, więc po prostu dodajesz wszystkie wiersze podczas pierwszego uruchomienia, nie pozostawiając nic na kolejne uruchomienia.
Wypróbuj następujące:
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;