如何将oracle分层查询转换为postgresql?

如何将oracle分层查询转换为postgresql?,postgresql,oracle11g,hierarchical-query,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 SELE

我想将下面提到的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输出(实际结果)


在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;

编辑您的问题,并粘贴PostgreSQL的
create table
insert
语句(至少)以重现您的问题。从您的图片来看,Oracle和PostgreSQL的数据看起来都不一样。如果它们没有相同的数据,不同的结果是不可避免的。你能展示一下原始数据的样子吗?这些查询是等价的,它们给出了完全相同的行集。两个结果集中的行顺序可以不同,但这是正确的,因为根据定义,SQL中的表和结果集没有任何顺序,除非使用
orderby
子句,请参阅:。因此,在两个结果的顶部看不到相同的几行。@krokodilko排序可能有问题,但PG查询的指定不正确。现在,它将永远不会迭代。
如果CTE查询中的sub_tree_id=0
是Oracle的CONNECT BY query中的sub_tree_id=0的一部分,但在原始查询中没有这样的子句,@krokodilko在非递归项中没有过滤器,就不会有迭代。这可能是PG和Oracle之间的差异,仍然需要在PG中复制相同的输出。请浏览一下我的答案,你就会明白为什么这个查询是错误的。@Patrick:过滤器不是“必需”的,可以使递归查询在Postgres中工作,但我同意添加它可能是正确的。原始的Oracle查询可能是错误的—是否可以在postgreSQL中保持与在Oracle中生成的相同的显示顺序?