sql - 如何有效地使用递归查询创建斐波那契数列

标签 sql plsql oracle11gr2

你可以在这里测试我的代码: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=61a67764f626bfadb1e9594e1ae08229

打印斐波那契数列前 n 项的代码:

with fibo(s2,s1,n) as(
    select 1  ,1  ,1  from dual
    union all
    select s1+s2,s2,n+1 from fibo where n<12
)
select s2 from fibo;

它可以工作,但它使用的内存可能是所需内存的两倍。每行包含选择前续集的第n项和第n-1项

因此我尝试使用滞后功能

with fibo(s,n) as(
    select 1,1 from dual
    union all
    select LAG(s, 1, 0) OVER ( ORDER BY s) +LAG(s, 2, 0) OVER ( ORDER BY s),n+1 from fibo where n<12
)
Select * from fibo

但我只得到了 1 的续集。(与 lead 函数相同的东西)

我试图了解这会发生什么:

with test(s,d1,d2,n) as(
    select 1,0,0,1 from dual
    union all
    select
        2*s,LAG(s, 1, 0) OVER (a  ORDER BY s) ,
        LAG(s, 2, 0) OVER ( ORDER BY s),n+1
    from test where n<12
)
select * from test 

好像lag总是返回0,难道递归查询不能用lag和lead吗?还是我做错了什么?

最佳答案

“递归”查询不是递归的,而是迭代的。
迭代从 anchor 开始(UNION ALL 中未引用 CTE 的部分)。
对于随后的每次迭代,前一次迭代的结果集(CTE 的别名)用作输入。
当结果集为空时,迭代停止。

在您的特定尝试中, anchor 返回一条记录,随后的每个查询也是如此。 显然 LAG(s, 2, 0) 总是返回 0

关于sql - 如何有效地使用递归查询创建斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60605486/

相关文章:

MySQL查询以查找表中不在列表中的ID

oracle - 查询导致数据库失败,ORA-0113

php - 为什么在 UPDATErequest 中请求 +1 会得到 +2?

mysql - "Join"不同表的admins变成一个字符串

sql - 仅基于更改日志数据重建历史表行

oracle - 在 SQL Developer 中打印变量的值

oracle - 如何修剪所有字符串类型表中所有行中的所有列?

oracle - 如何在一个脚本中更改 Oracle 模式上的所有索引 (10G)

sql - 给定表数据的期望输出

java - 无法使用 oracle.apex.APEXExport 类登录数据库