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

[精华] 关于db2递归的一个例子

[复制链接]
论坛徽章:
5
2009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:08:29ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
21#
发表于 2009-2-25 20:47 | 只看该作者
原帖由 myfriend2010 于 2008-3-14 14:18 发表
with t (t1,t2,t3) as (
values
('A1', 1 ,'01'),('A1' ,1, '02'),('A1', 1, '03'),
('A2', 1, '01'),('A2', 2, '01'),('A2', 2 ,'02')
),
t1(t11,t22,t33,t44,t55) as (
select t1,t2,t3,rownumber() over(partition by t1,t2),rownumber() over(partition by t1,t2) as t4 from t
),
t3(s1,s2,s3,s4,s5) as(
select t11,t22,cast(t33 as varchar(100)),t44,t55 from t1 where T44 =1 and t55=1
union all
select a.s1,a.s2,cast(a.s3||'-'||b.t33 as varchar(100)),a.s4+1,a.s5 from t3 a,t1 b where a.s1=b.t11 and a.s2=b.t22  and a.s4 = b.t55-1
)
select s1,s2,s3 from t3 x where x.s4=(select max(s4) from t3 y where x.s1=y.s1 and x.s2=y.s2) order by s1,s2
;
------------------------------------
'A1'        1        '01-02-03'
'A2'        1        01
'A2'        2        '01-02'



如何保证顺序就是  '01-02-03'  而不是 '02-01-03'  ?
rownumber() over(partition by t1,t2) 是不是应为  rownumber() over(partition by t1,t2 order by t3)

使用道具 举报

回复
论坛徽章:
5
2009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:08:29ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
22#
发表于 2009-2-25 20:48 | 只看该作者
原帖由 sheisqueen 于 2008-10-18 20:01 发表
DB2 9.5里也支持 Connect By了。


Really ?  

我得找找。。。

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2009-2-26 09:58 | 只看该作者
感谢楼主分享,写的很好很详细,逻辑都很清晰,我测试了一下,第归的效率很差,100万的数据量花了近半个小时,相对来说,我会选折用一个存储过程来实现,仅仅只需要花2分钟,只有在小数据量的时候用第归还是可以的。

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-03-01 11:20:00ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51
24#
发表于 2010-1-25 10:27 | 只看该作者
哈哈,老赵,上午拜读了一下。

--  create table test1
--  (
--    t1 varchar(100),
--    t2 int,
--    t3 varchar(100)
--  ) ;
--  
--  insert into test1
--  values
-- ('A1', 1 ,'01'),('A1' ,1, '02'),('A1', 1, '03'),
-- ('A2', 1, '01'),('A2', 2, '01'),('A2', 2 ,'02') ;
--

--  select * from test1 ;
--  
-- with x (t1,t2,cnt,list,t3,len)
-- as (select t1,t2,count(*) over (partition by t1,t2),cast(t3 as varchar(100)),t3,1 from  test1
--     union all
--     select x.t1,x.t2,x.cnt,x.list||','||e.t3,e.t3,x.len+1
--     from test1 e,x where e.t1=x.t1 and e.t2=x.t2 and e.t3>x.t3
--    )
-- select t1,t2,list   from x where len=cnt;
--

使用道具 举报

回复

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

本版积分规则 发表回复

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