Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1402097
  • 博文数量: 556
  • 博客积分: 12626
  • 博客等级: 上将
  • 技术积分: 5799
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 15:56
个人简介

从事IT基础架构多年,发现自己原来更合适去当老师……喜欢关注新鲜事物,不仅限于IT领域。

文章分类

全部博文(556)

文章存档

2019年(6)

2018年(15)

2017年(17)

2016年(11)

2015年(2)

2014年(2)

2013年(36)

2012年(54)

2011年(100)

2010年(41)

2009年(72)

2008年(14)

2007年(82)

2006年(104)

分类: Oracle

2006-02-21 14:16:32

    最近缴费卡并卡事件较多,为了方便跟踪,使用start with……connect by可以对卡的并卡状况进行一系列的跟踪。例如:
SQL> SELECT LPAD(outcardnumber, LENGTH(outcardnumber)+(LEVEL*2) -2,'_')
  2  AS cardnumber
  3  FROM rcpms.rcpms_unitecard
  4  START WITH outcardnumber='030399529176'
  5  CONNECT BY PRIOR incardnumber=outcardnumber;
CARDNUMBER
--------------------------------------------------------------------------------
030399529176
__030386295685
____030350690996
______030394432312
________030361447641
__________030389355736
____________030352075862
______________030366761588
________________030387064026
__________________030365336999
____________________030334258646
______________________030355463544
________________________030318082105
__________________________030301996949
 
SQL> SELECT LPAD(outcardnumber, LENGTH(outcardnumber)+(LEVEL*2) -2,'_')
  2  AS cardnumber
  3  FROM rcpms.rcpms_unitecard
  4  START WITH outcardnumber='030399529176'
  5  CONNECT BY PRIOR outcardnumber=incardnumber;
CARDNUMBER
--------------------------------------------------------------------------------
030399529176
__030383691552
____030397699599
______030356960881
________030346210764
__________030320028697
____________030339419184
______________030357446358
________________030341150148
__________________030300297116
____________________030308827641
 
这里,根据connect子句中条件的位置不同可以实现向上或向下的分级查询,即第一个例子是以030399529176作为并出卡跟踪一系列的并入卡,第二个例子是以同样的030399529176作为并入卡,找出一系列的并出卡。
 
自顶向下的规则是:
Top down: Column1 = Parent Key
         Column2 = Child Key
自底向上的规则是
Bottom up Column1 = Child Key
          Column2 = Parent Key
例1中可以理解为incardnumber的子行去等于outcardnumber的父行,因此是一种自底向上的行为。例2可以理解为outcardnumber的子行去等于incardnumber的父行,因此是一种自上而下的行为
 
另外,这里lpad函数用来填充字段串左边的位置,从而达到格式化的目的。
 
这里需要注意使用start with……connect by子句还需要注意where和connect by中条件的区别,
例如 where outmoney=100是去除了outmoney不等于的100的树中的所有节点,而
CONNECT BY PRIOR outcardnumber=incardnumber and outmoney=100将去除不等于100的节点下的所有分支。
阅读(13428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~