免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2316 | 回复: 4
打印 上一主题 下一主题

请叫高手,递归语句里怎样限定循环次数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-23 10:28 |只看该作者 |倒序浏览
用sql写一个递归,计算2的10次方,下面是我写的,但没有循环次数,我应改怎么加入呢?

with r(c) as (select * from (values(2)) as t union all select c*2 from r ) select * from r;

论坛徽章:
0
2 [报告]
发表于 2004-02-23 10:41 |只看该作者

请叫高手,递归语句里怎样限定循环次数?

我记得可以加一个变量,他的值可以传递倒下一个调用里面去,具体怎么写忘了,,反正我是实现国的,,db2也有这个的帮助,里面就写了怎么实现的!

论坛徽章:
0
3 [报告]
发表于 2004-02-23 10:58 |只看该作者

请叫高手,递归语句里怎样限定循环次数?

这是db2例子上的,我给你解释一下:
有表
CREATE TABLE PARTLIST
                 (PART VARCHAR(,
                  SUBPART VARCHAR(,
                  QUANTITY INTEGER);
PART:部门编号
SUBPART:下级部门编号
AUANTITY:该部门的数量

现在我们只要要层次只深度只到第二层的所有部门的收入,并且算出这个部门所属的层次,

WITH RPL (LEVEL, PART, SUBPART, QUANTITY) AS
      (
         SELECT 1,               ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
          FROM PARTLIST ROOT
          WHERE ROOT.PART = '01'
       UNION ALL
         SELECT PARENT.LEVEL+1, CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
          FROM RPL PARENT, PARTLIST CHILD
          WHERE PARENT.SUBPART = CHILD.PART
            AND PARENT.LEVEL < 2
      )
SELECT PART, LEVEL, SUBPART, QUANTITY
   FROM RPL;

结果:
PART     LEVEL       SUBPART  QUANTITY
  -------- ----------- -------- -----------
  01                 1 02                 2
  01                 1 03                 3
  01                 1 04                 4
  01                 1 06                 3
  02                 2 05                 7
  02                 2 06                 6
  03                 2 07                 6
  04                 2 08                10
  04                 2 09                11
  06                 2 12                10
  06                 2 13                10


分析,
起到限制层次的字段就是:
PAL(LEVEL)  这个字段
在SQL语句的UION ALL 后面的PARENT.LEVEL+1中就是开始计算层次
这样你在后面where 中加上限制PARENT.LEVEL<N
N就是你的层次了哦

哈,,祝工作愉快哦!

论坛徽章:
0
4 [报告]
发表于 2004-02-25 12:49 |只看该作者

请叫高手,递归语句里怎样限定循环次数?

up

论坛徽章:
0
5 [报告]
发表于 2004-02-26 21:19 |只看该作者

请叫高手,递归语句里怎样限定循环次数?

第一种:使用门限值:
   with r(c) as (select  * from (values(2)) as t union all select c*2 from r where c<=power(2,9)) select * from ;

第二种:限定循环次数

  with r(c,d) as (select  * from (values(2,1)) t union all select c*2,d+1 from r where d<10) select c,d from r;


感谢 law 提供 tip!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP