gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:47:28 24 4
gpt4 key购买 nike

你可以在这里测试我的代码: 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com