PostgreSQLでは、再帰クエリは最初に初期を指定することによって構築されます 行のセット(非再帰用語 、つまり、階層のルートレベルまたは最終レベルにあるもの)。後続の反復(再帰項 、UNION ALL
の後のサブクエリ )次に、入力行セットの残りの行から結果セットに行を追加します。 行が追加されなくなるまで。
あなたの場合、最初のサブクエリはフィルタリングされていないので、最初の実行ですべての行を追加するだけで、後続の実行には何も残しません。
次のことを試してください:
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;