斐波那契数列,又称黄金分割数列,指的是这样一个数列:1,1,2,3,5,8,13,21,…… 从第三项开始,每一项都等于前两项之和。
在oracle中,使用传统的connect by方法做不出来,但是用oracle10g以上所支持的model可以轻松构造,代码如下:
SELECT rn, n
FROM (SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM <= 10)
MODEL RETURN UPDATED ROWS
DIMENSION BY (rn)
MEASURES (1 n)
RULES (
n[any] order by rn asc = DECODE(cv(rn), 1, 1, 2, 1, n[cv()-2]+n[cv()-1])
);
当然,Oracle11g之后的版本,也可以使用WITH递归的方法构造,代码如下:
WITH t(n, last_n, cnt) AS (SELECT 1, 0, 1 FROM DUAL
UNION ALL
SELECT t.n+t.last_n, t.n, t.cnt+1
FROM t
WHERE t.cnt < 10
)
SELECT n FROM t;
实际上,斐波那契数列可以使用通项公式表示,如下:
所以根据该通项公式,还是可以直接使用connect by计算出来,代码如下:
SELECT LEVEL,
1/power(5, 0.5)*(power((1+ power(5, 0.5))/2, LEVEL) - power((1- power(5, 0.5))/2, LEVEL))
FROM dual
CONNECT BY LEVEL <= 10;