查看: 2976|回复: 2

sys_connect_by_path 进行列连接的疑问

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2007-7-28 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从网上看到的例子 有点疑惑
[PHP]
SQL> DESC TEST
Name Type         Nullable Default Comments
---- ------------ -------- ------- --------
A    NUMBER       Y                        
B    VARCHAR2(20) Y   

SQL> select * from test;

         A B
---------- --------------------
         1 a
         1 b
         1 c
         1 d
         1 e
         2 a
         2 b
         3 a
         3 v
         3 d

想要的结果:
         A RESULT
---------- --------------------------------------------------------------------------------
         1 e;d;c;b;a
         2 b;a
         3 v;d;a

有以下两种方法:
方法1:
select a,substr(max(sys_connect_by_path(b,';')),2) result
from
(select a,b,
        row_number() over(order by a,b desc) rn,
        row_number() over(order by a,b desc)-1 rn1,
        --+dense_rank() over(order by a)) rn,
        max(b) over(partition by a) bs
from test)
start with b=bs
connect by rn1 = prior rn and a = prior a
group by a;

方法2:
select a,max(sys_connect_by_path(b,';')) result
from
(select a,b,
        (row_number() over(order by a,b desc)
        --row_number()-1 over(order by a,b desc) rn1
        +dense_rank() over(order by a)) rn,
        max(b) over(partition by a) bs
from test)
start with b=bs
connect by rn-1 = prior rn
group by a;
[/PHP]

对于方法2中 rn-1 = prior rn 不是很理解 请指点 顺便我看他说是通过构造树来做到的
问题:1、 prior的用法(自己在网上搜索了 看了不是很理解)
2、在上面例子中是如何构造树的?
论坛徽章:
0
2#
 楼主| 发表于 2007-7-28 21:57 | 只看该作者
[PHP]
自己把里面的运行了下
SQL> select a,b,(row_number() over(order by a,b desc)+dense_rank() over(order by a)) rn from test;

         A B                            RN
---------- -------------------- ----------
         1 e                             2
         1 d                             3
         1 c                             4
         1 b                             5
         1 a                             6
         2 b                             8
         2 a                             9
         3 v                            11
         3 d                            12
         3 a                            13

10 rows selected
[/PHP]

再参照http://www.itpub.net/716901.html这篇文章 总算搞懂了

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
3#
发表于 2007-7-28 22:43 | 只看该作者
只有自己动手做才会提高,支持!

使用道具 举报

回复

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

本版积分规则 发表回复

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