【问题标题】:Trying to generate Fibonacci series using recursive WITH clause, getting error: 'cycle detected while executing'尝试使用递归 WITH 子句生成斐波那契数列,出现错误:“执行时检测到循环”
【发布时间】:2015-07-20 02:35:16
【问题描述】:

我正在尝试使用以下查询(递归 WITH 子句)生成斐波那契数列。

WITH X(Pnbr,Cnbr) AS
(SELECT 0, 1 FROM dual
 UNION ALL
 SELECT X.Cnbr, X.Pnbr+X.Cnbr FROM X
 WHERE X.Cnbr<50
)
 SELECT * FROM X

但是我收到了这个错误

ORA-32044: cycle detected while executing recursive WITH query

为什么?

【问题讨论】:

    标签: sql oracle recursion


    【解决方案1】:

    您在第一次迭代时的数据将是

    PNBR  CNBR
    0   , 1
    1   , 1 + 0
    

    所以,CNBR 是 1 是前两行.. 检测到循环!

    CONNECTING 条件必须是唯一的

    所以你可能需要维护一个迭代器。

    ROWNUM 是我在这里使用的。

    WITH X(iter,Pnbr,Cnbr) AS
    (SELECT 1,0, 1 FROM dual
     UNION ALL
     SELECT iter + rownum, X.Cnbr, X.Pnbr+X.Cnbr FROM X
     WHERE iter < 50
    )
     SELECT iter,Pnbr FROM X;
    

    DEMO

    【讨论】:

    • 谢谢...这很有帮助
    【解决方案2】:

    我同意 M. Ravisankar 的回答(自 2015 年起)中的诊断,但不同意补救措施。

    为了准确处理原始帖子中出现的情况,递归 CTE 提供了CYCLE 子句。在这个问题中,虽然Pnbr 列和Cnbr 列中会有重复值,但单独考虑时,复合 @987654324 中没有重复值(重复) @。

    所以,查询可以这样写:

    WITH X(Pnbr,Cnbr) AS
    (SELECT 0, 1 FROM dual
     UNION ALL
     SELECT X.Cnbr, X.Pnbr+X.Cnbr FROM X
     WHERE X.Cnbr<50
    )
    cycle Pnbr, Cnbr set cycle to 'Y' default 'N'    ----
    SELECT Pnbr, Cnbr FROM X
    

    注意cycle 子句(倒数第二行),还有SELECT Pnbr, Cnbr 而不是SELECT *(如果我们在这里选择*,我们也会得到cycle 列,我们不需要它)。

    【讨论】:

      【解决方案3】:

      修改 where 子句中的列。使用X.Pnbr+X.Cnbr 而不是X.Cnbr 作为条件,以便Oracle 使用两个引用的列进行行循环检测。

      WITH X(Pnbr,Cnbr) AS
      (SELECT 0, 1 FROM dual
       UNION ALL
       SELECT X.Cnbr, X.Pnbr+X.Cnbr FROM X
       -- Cnbr column is used to detect the cycle data
       WHERE X.Pnbr+X.Cnbr < 50
      )
       SELECT * FROM X;
      

      根据Oracle Doc

      如果省略 CYCLE 子句,则递归 WITH 子句在发现循环时返回错误。在这种情况下,如果其祖先行之一对于在递归成员的 WHERE 子句中引用的 query_name 的列别名列表中的所有列具有相同的值,则该行形成一个循环。

      查询输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 2011-07-27
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2012-11-19
        • 2016-11-07
        • 2012-02-16
        相关资源
        最近更新 更多