首先来参考一下oracle 11.2的新特性,递归查询
http://www.oracle.com/technetwork/cn/articles/hartley-recursive-086819-zhs.html
小试一下使用with递归来解决问题
题目是
啤酒 2元1瓶
4个瓶盖换1瓶
2个空瓶换1瓶
10元可以喝几瓶
--------------------------------------------------------------------------------------------------
/*
啤酒 2元1瓶
4个瓶盖换1瓶
2个空瓶换1瓶
10元可以喝几瓶
*/
with r(btl,lid,lqr) as
(select 10 / 2 btl, 10 / 2 lid, 10 / 2 lqr from dual
-- 初始10元,5个瓶子,5个盖子,5瓶酒
union all
-- 递归
select mod(btl, 2) + trunc(btl / 2) + trunc(lid / 4) btl, -- 取模得到剩余瓶子或瓶盖
mod(lid, 4) + trunc(btl / 2) + trunc(lid / 4) lid, -- 换酒规则,每多一瓶酒,就多一个瓶子和一个瓶盖,多一瓶酒
lqr + trunc(btl / 2) + trunc(lid / 4) lqr
from r
where trunc(btl / 2) != 0 or trunc(lid / 4) != 0 -- 终止条件
) select btl "剩余瓶子", lid "剩余瓶盖", lqr "喝了的酒(瓶)" from r;
http://www.oracle.com/technetwork/cn/articles/hartley-recursive-086819-zhs.html
小试一下使用with递归来解决问题
题目是
啤酒 2元1瓶
4个瓶盖换1瓶
2个空瓶换1瓶
10元可以喝几瓶
--------------------------------------------------------------------------------------------------
/*
啤酒 2元1瓶
4个瓶盖换1瓶
2个空瓶换1瓶
10元可以喝几瓶
*/
with r(btl,lid,lqr) as
(select 10 / 2 btl, 10 / 2 lid, 10 / 2 lqr from dual
-- 初始10元,5个瓶子,5个盖子,5瓶酒
union all
-- 递归
select mod(btl, 2) + trunc(btl / 2) + trunc(lid / 4) btl, -- 取模得到剩余瓶子或瓶盖
mod(lid, 4) + trunc(btl / 2) + trunc(lid / 4) lid, -- 换酒规则,每多一瓶酒,就多一个瓶子和一个瓶盖,多一瓶酒
lqr + trunc(btl / 2) + trunc(lid / 4) lqr
from r
where trunc(btl / 2) != 0 or trunc(lid / 4) != 0 -- 终止条件
) select btl "剩余瓶子", lid "剩余瓶盖", lqr "喝了的酒(瓶)" from r;
剩余瓶子 | 剩余瓶盖 | 喝了的酒(瓶) | |
| 5 | 5 | 5 |
| 4 | 4 | 8 |
| 3 | 3 | 11 |
| 2 | 4 | 12 |
| 2 | 2 | 14 |
| 1 | 3 | 15 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29619999/viewspace-2120253/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29619999/viewspace-2120253/