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;

ORACLE 输出(预期结果)

预言机输出

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 回答