No PostgreSQL, as consultas recursivas são construídas especificando primeiro o inicial conjunto de linhas (o termo não recursivo , ou seja, aqueles no nível raiz ou final da hierarquia). Iterações subsequentes (sobre o termo recursivo , a subconsulta após
UNION ALL
) e adicione linhas ao conjunto de resultados das linhas restantes no conjunto de linhas de entrada até que não sejam adicionadas mais linhas. No seu caso, a subconsulta inicial não é filtrada, então você simplesmente adiciona todas as linhas na execução inicial, não deixando nada para as execuções subsequentes.
Tente o seguinte:
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;