En PostgreSQL, las consultas recursivas se construyen especificando primero el inicial conjunto de filas (el término no recursivo , es decir, aquellos en el nivel raíz o final de la jerarquía). Iteraciones posteriores (sobre el término recursivo , la subconsulta después de UNION ALL
) luego agregue filas al conjunto de resultados de las filas restantes en el conjunto de filas de entrada hasta que no se agreguen más filas.
En su caso, la subconsulta inicial no está filtrada, por lo que simplemente agrega todas las filas en la ejecución inicial, sin dejar nada para las ejecuciones posteriores.
Prueba lo siguiente:
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;