Dans PostgreSQL, les requêtes récursives sont construites en spécifiant d'abord le initial ensemble de lignes (le terme non récursif , c'est-à-dire ceux au niveau racine ou final de la hiérarchie). Itérations suivantes (sur le terme récursif , la sous-requête après le UNION ALL
) puis ajoutez des lignes au jeu de résultats à partir des lignes restantes dans le jeu de lignes d'entrée jusqu'à ce qu'il n'y ait plus de lignes ajoutées.
Dans votre cas, la sous-requête initiale n'est pas filtrée, vous ajoutez donc simplement toutes les lignes lors de l'exécution initiale, ne laissant rien pour les exécutions suivantes.
Essayez ce qui suit :
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;