作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你可以在这里测试我的代码: 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/
我是一名优秀的程序员,十分优秀!