123
返回列表 发新帖
楼主: 372369432

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

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
21#
发表于 2014-11-5 22:58 | 只看该作者
野花提到的对数反对数方法:

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 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
          )
SELECT ID,EXP(SUM(LN(NUM)))
  FROM (
SELECT CONNECT_BY_ROOT(ID) ID
      ,NUM
FROM   T
CONNECT BY ID = PRIOR PID
)
GROUP BY ID;

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
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
22#
发表于 2014-11-6 08:13 | 只看该作者
lastwinner 发表于 2014-11-5 16:49
啊?我还以为你早就知道呢
很早就有人提出这方法了

模糊中是有点印象,但是在这之前肯定不会主动的想起来去用。

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2014-11-6 22:01 | 只看该作者
peter1166 发表于 2014-11-5 09:40
方法1:
WITH T AS (
          SELECT 0 ID, NULL PID , 1 NUM FROM DUAL UNION ALL

高手呀!这个工具包就知道!

使用道具 举报

回复
论坛徽章:
1
娜美
日期:2022-09-24 21:10:49
24#
发表于 2022-3-31 23:09 | 只看该作者
WITH TMP 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 * FROM TMP
MODEL RETURN UPDATED ROWS
DIMENSION BY (ID)
MEASURES(PID,NUM,CAST(' ' AS VARCHAR2(100) ) AS 表达式,0 ALL_NUM)
RULES (
表达式[ID] ORDER BY ID=PRESENTNNV(表达式[CV()-1],表达式[CV()-1]||'*'||NUM[CV()],NUM[CV()])
,ALL_NUM[ID] ORDER BY ID=PRESENTNNV(ALL_NUM[CV()-1],ALL_NUM[CV()-1]*NUM[CV()],1)
);

使用道具 举报

回复
论坛徽章:
1
娜美
日期:2022-09-24 21:10:49
25#
发表于 2022-3-31 23:33 | 只看该作者
----标量子查询大家都说很慢 不推荐
WITH TMP 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 T.*
,(SELECT LISTAGG(TT.NUM,'*') WITHIN GROUP (ORDER BY TT.ID)  FROM TMP TT WHERE TT.ID<=T.ID) 算数式
,DBMS_AW.EVAL_NUMBER((SELECT LISTAGG(TT.NUM,'*') WITHIN GROUP (ORDER BY TT.ID)  FROM TMP TT WHERE TT.ID<=T.ID )) RESULT
FROM TMP T
ORDER BY T.ID;
-----------------------------------------------
ID        PID        NUM        算数式        RESULT
0                1        1                   1
1        0        2        1*2                   2
2        1        2        1*2*2           4


使用道具 举报

回复
论坛徽章:
0
26#
发表于 2022-6-17 09:35 | 只看该作者
with tt 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 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 )
   SELECT a.id,a.pid,a.num,DBMS_AW.eval_number(substr(sys_connect_by_path(a.num,'*'),2,10))num_all
   FROM TT A
   start with a.pid is null
   connect by prior a.id=a.pid
   ;

使用道具 举报

回复

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

本版积分规则 发表回复

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