3

以下のOracle階層クエリをpostgresqlに変換したい

SELECT catalog_id, sub_tree_id
FROM   my_catalog
CONNECT BY PRIOR catalog_id = sub_tree_id;

次のpostgresqlクエリを使用してみましたが、期待した結果が得られません

WITH RECURSIVE q AS (
SELECT po.catalog_id,po.sub_tree_id
  FROM my_catalog po
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;

オラクルの出力(期待される結果)

オラクルの出力

POSTGRESQL の出力 (実際の結果)

ポストグレス出力

4

1 に答える 1

1

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;
于 2016-12-23T15:41:27.743 に答える