方法一:用通项(最愚蠢但最数学)
SQL> set timing on
SQL> SELECT ROUND(1/power(5,0.5)*(power(((1+power(5,0.5))/2),rownum)-power(((1-power(5,0.5))/2),rownum)),0) fbn
2 FROM dual
3 CONNECT BY rownum<=10
4 /
FBN
----------
1
1
2
3
5
8
13
21
34
55
已选择10行。
已用时间: 00: 00: 00.00
SQL>
方法二:用with递归实现(最巧妙最精致)
SQL> WITH t(n,last_n,cnt) AS
2 ( SELECT 1,0,1 FROM DUAL
3 UNION ALL
4 SELECT t.n+t.last_n, t.n, t.cnt+1 FROM t WHERE t.cnt<10
5 )
6 SELECT n FROM T
7 /
N
----------
1
1
2
3
5
8
13
21
34
55
已选择10行。
已用时间: 00: 00: 00.03
SQL>
方法三:用model递归查询(最时尚最醉人)
SQL> SELECT rn,
2 n
3 FROM
4 (SELECT ROWNUM rn FROM DUAL CONNECT BY ROWNUM<=10
5 ) MODEL RETURN UPDATED ROWS DIMENSION BY (rn) MEASURES (1 n) RULES ( n[ANY]
6 ORDER BY rn=DECODE(cv(rn),1,1,2,1, n[cv()-2]+n[cv()-1]))
7 /
RN N
---------- ----------
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
已选择10行。
已用时间: 00: 00: 00.02
SQL>
简评:oracle提供的model功能真的好强大,可以实现好多复杂的功能!with递归是比较好理解,以后可以多使用!通项法对数学理论基础要求比较高!