In PostgreSQL werden rekursive Abfragen konstruiert, indem zuerst der Anfang angegeben wird Reihe von Zeilen (der nicht rekursive Begriff , d. h. diejenigen auf der obersten oder letzten Ebene der Hierarchie). Nachfolgende Iterationen (über den rekursiven Begriff , die Unterabfrage nach UNION ALL
) fügen Sie dann der Ergebnismenge aus den verbleibenden Zeilen in der Eingabezeilenmenge Zeilen hinzu bis keine Zeilen mehr hinzugefügt werden.
In Ihrem Fall ist die anfängliche Unterabfrage ungefiltert, sodass Sie beim ersten Lauf einfach alle Zeilen hinzufügen und nichts für nachfolgende Läufe übrig lassen.
Versuchen Sie Folgendes:
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;