查看: 9747|回复: 25

[SQL] 【讨论】oracle递归求乘积

[复制链接]
论坛徽章:
4
优秀写手
日期:2014-08-15 06:00:132015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47慢羊羊
日期:2015-04-08 13:42:29
跳转到指定楼层
1#
发表于 2014-11-5 07:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在遇到一个这样的需求,每一行的数量字段的值 都等于它本身*它的所有上级的该字段的值,
原表
id pid num
0       1
1   0  2   
2   0  2
希望实现递归之后的效果,增加了一列
id pid num all_num
0       1       1
1   0  2       1*2=2
2   1  2       1*2*2=4


大家遇到过这种需求么 谢谢大家!因为本机上没有开发环境,麻烦了,可能描述的不是很清楚
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
2#
发表于 2014-11-5 09:40 | 只看该作者

方法1:
WITH T AS (
          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL
          SELECT 1 ID, 0   PID ,2   NUM FROM DUAL UNION ALL
          SELECT 2 ID, 1   PID ,2   NUM FROM DUAL
          )
SELECT ID , PID , LTRIM(SYS_CONNECT_BY_PATH(NUM,'*'),'*') || ' = ' STR
       ,DBMS_AW.eval_number(LTRIM(SYS_CONNECT_BY_PATH(NUM,'*'),'*')) VAL
FROM   T
CONNECT BY PRIOR ID = PID
START WITH PID IS NULL ;

        ID        PID STR                                                                                     VAL
---------- ---------- -------------------------------------------------------------------------------- ----------
         0            1 =                                                                                       1
         1          0 1*2 =                                                                                     2
         2          1 1*2*2 =                                                                                   4
         

方法2:
WITH T AS (
          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL
          SELECT 1 ID, 0   PID ,2   NUM FROM DUAL UNION ALL
          SELECT 2 ID, 1   PID ,2   NUM FROM DUAL
          )
   ,T1(ID,PID,NUM) AS (
          SELECT ID,PID,NUM FROM T WHERE PID IS NULL
          UNION ALL
          SELECT T.ID , T.PID , T.NUM*T1.NUM
          FROM T1 ,T
          WHERE T1.ID = T.PID
          )
    SELECT * FROM T1 ;
   
        ID        PID        NUM
---------- ---------- ----------
         0                     1
         1          0          2
         2          1          4

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
11
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34懒羊羊
日期:2015-03-04 14:52:11懒羊羊
日期:2015-02-10 13:36:05马上有对象
日期:2015-02-02 12:29:02红宝石
日期:2015-01-19 09:44:10马上有车
日期:2014-11-11 14:16:07马上有车
日期:2014-03-27 15:59:39优秀写手
日期:2014-03-12 06:00:13马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09
3#
发表于 2014-11-5 09:42 | 只看该作者
peter1166 发表于 2014-11-5 09:40
方法1:
WITH T AS (
          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL

原来还有DBMS_AW.eval_number

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
4#
发表于 2014-11-5 10:09 | 只看该作者
moseslin 发表于 2014-11-5 09:42
原来还有DBMS_AW.eval_number

  我也是跟 oracle_cj  学的。

使用道具 举报

回复
论坛徽章:
4
优秀写手
日期:2014-08-15 06:00:132015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47慢羊羊
日期:2015-04-08 13:42:29
5#
 楼主| 发表于 2014-11-5 10:30 | 只看该作者
peter1166 发表于 2014-11-5 09:40
方法1:
WITH T AS (
          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL

你这种方式 是不是不能够无线递归呢 假如我有4层的话 这种方式可行么 谢谢你的回答

使用道具 举报

回复
论坛徽章:
4
优秀写手
日期:2014-08-15 06:00:132015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47慢羊羊
日期:2015-04-08 13:42:29
6#
 楼主| 发表于 2014-11-5 10:31 | 只看该作者
peter1166 发表于 2014-11-5 09:40
方法1:
WITH T AS (
          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL

你这种方式 是不是不能够无线递归呢 假如我有4层的话 这种方式可行么 谢谢你的回答

使用道具 举报

回复
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
7#
发表于 2014-11-5 10:31 | 只看该作者
peter1166 发表于 2014-11-5 10:09
我也是跟 oracle_cj  学的。

要不就递归with。。要不就用你的强项model,peter什么时候把自己的model学习心得整理一份出来?

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
8#
发表于 2014-11-5 10:38 | 只看该作者
Naldonado 发表于 2014-11-5 10:31
要不就递归with。。要不就用你的强项model,peter什么时候把自己的model学习心得整理一份出来?

model 的心得就是忘了好几次, 又重学了好几次。

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
11
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34懒羊羊
日期:2015-03-04 14:52:11懒羊羊
日期:2015-02-10 13:36:05马上有对象
日期:2015-02-02 12:29:02红宝石
日期:2015-01-19 09:44:10马上有车
日期:2014-11-11 14:16:07马上有车
日期:2014-03-27 15:59:39优秀写手
日期:2014-03-12 06:00:13马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09
9#
发表于 2014-11-5 10:41 | 只看该作者
peter1166 发表于 2014-11-5 10:09
我也是跟 oracle_cj  学的。

在PLSQL Packages and Types Reference 11g release 1里没找到

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
10#
发表于 2014-11-5 10:42 | 只看该作者
372369432 发表于 2014-11-5 10:31
你这种方式 是不是不能够无线递归呢 假如我有4层的话 这种方式可行么 谢谢你的回答

自己可以试验一下。

          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL
          SELECT 1 ID, 0   PID ,2   NUM FROM DUAL UNION ALL
          SELECT 2 ID, 1   PID ,2   NUM FROM DUAL UNION ALL
          SELECT 3 ID, 2   PID ,2   NUM FROM DUAL UNION ALL
          SELECT 4 ID, 3   PID ,2   NUM FROM DUAL UNION ALL
          SELECT 22 ID, 1   PID ,3   NUM FROM DUAL UNION ALL
          SELECT 33 ID, 22   PID ,3   NUM FROM DUAL UNION ALL
          SELECT 44 ID, 33   PID ,3   NUM FROM DUAL

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表