如何将oracle层次结构查询转换为postgresql?

时间:2016-12-23 13:25:40

标签: postgresql oracle11g hierarchical-query

我想将下面提到的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;

ORACLE OUTPUT(预期结果)

oracle output

POSTGRESQL输出(实际结果)

postgress output

1 个答案:

答案 0 :(得分: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;