【问题标题】:How to convert oracle hierarchical queries to postgresql?如何将 oracle 分层查询转换为 postgresql?
【发布时间】:2017-05-09 05:04:56
【问题描述】:

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

【问题讨论】:

  • 编辑您的问题,并粘贴create tableinsert PostgreSQL 语句(至少)以重现您的问题。从您的图像来看,Oracle 和 PostgreSQL 甚至看起来都没有相同的数据。如果他们没有相同的数据,不同的结果是不可避免的。
  • 你能展示一下原始数据的样子吗?
  • 这些查询是等效的,它们提供完全相同的行集。两个结果集中的行顺序可以不同,但​​这是正确的,因为根据定义,除非使用 order by 子句,否则 SQL 中的表和结果集没有任何顺序,请参阅:en.wikipedia.org/wiki/Result_set。因此,您不会在两个结果的顶部看到相同的几行。
  • @krokodilko 虽然订购可能是个问题,但 PG 查询指定不正确。就像现在一样,它永远不会迭代。

标签: postgresql oracle11g hierarchical-query


【解决方案1】:

在 PostgreSQL 中,递归查询是通过首先指定 initial 行集(非递归项,即位于层次结构的根或最终级别的行)来构造的.随后的迭代(通过递归项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;

【讨论】:

  • WHERE sub_tree_id = 0 in CTE query is a couterpart of START WITH sub_tree_id = 0 in Oracle's CONNECT BY query - 但在原始查询中没有这样的子句,
  • @krokodilko 在非递归项中没有过滤器,就不会有迭代。这可能是 PG 和 Oracle 的区别,仍然需要在 PG 中重现相同的输出。
  • 请看我的回答,你会明白为什么这个查询是错误的。
  • @Patrick:过滤器不是“必需”在 Postgres 中进行递归查询 - 但我同意添加它可能是正确的。原来的 Oracle 查询在那里可能是错误的
  • postgreSQL 中是否可以保持与 oracle 中生成的显示顺序相同的显示顺序?
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多