隨筆-314  評論-209  文章-0  trackbacks-0

          SELECT ename  
          FROM scott.emp   
          START WITH ename = 'KING'   
          CONNECT BY PRIOR empno = mgr;   
           
          --得到結(jié)果為:  
           
          KING  
          JONES  
          SCOTT  
          ADAMS  
          FORD  
          SMITH  
          BLAKE  
          ALLEN  
          WARD  
          MARTIN  
          TURNER  
          JAMES  
           
           
           
          而:  
           
           
           
          SELECT SYS_CONNECT_BY_PATH(ename, '>') "Path"   
          FROM scott.emp   
          START WITH ename = 'KING'   
          CONNECT BY PRIOR empno = mgr;  
           
           
           
          --得到結(jié)果為:  
           
           
           
          >KING  
          >KING>JONES  
          >KING>JONES>SCOTT  
          >KING>JONES>SCOTT>ADAMS  
          >KING>JONES>FORD  
          >KING>JONES>FORD>SMITH  
          >KING>BLAKE  
          >KING>BLAKE>ALLEN  
          >KING>BLAKE>WARD  
          >KING>BLAKE>MARTIN  
          >KING>BLAKE>TURNER  
          >KING>BLAKE>JAMES  
          >KING>CLARK  
          >KING>CLARK>MILLER 
          SELECT ename
          FROM scott.emp
          START WITH ename = 'KING'
          CONNECT BY PRIOR empno = mgr;

          --得到結(jié)果為:

          KING
          JONES
          SCOTT
          ADAMS
          FORD
          SMITH
          BLAKE
          ALLEN
          WARD
          MARTIN
          TURNER
          JAMES

           

          而:

           

          SELECT SYS_CONNECT_BY_PATH(ename, '>') "Path"
          FROM scott.emp
          START WITH ename = 'KING'
          CONNECT BY PRIOR empno = mgr;

           

          --得到結(jié)果為:

           

          >KING
          >KING>JONES
          >KING>JONES>SCOTT
          >KING>JONES>SCOTT>ADAMS
          >KING>JONES>FORD
          >KING>JONES>FORD>SMITH
          >KING>BLAKE
          >KING>BLAKE>ALLEN
          >KING>BLAKE>WARD
          >KING>BLAKE>MARTIN
          >KING>BLAKE>TURNER
          >KING>BLAKE>JAMES
          >KING>CLARK
          >KING>CLARK>MILLER
           


          其實SYS_CONNECT_BY_PATH這個函數(shù)是oracle9i才新提出來的!
          它一定要和connect by子句合用!
          第一個參數(shù)是形成樹形式的字段,第二個參數(shù)是父級和其子級分隔顯示用的分隔符!

          START WITH 代表你要開始遍歷的的節(jié)點!

          CONNECT BY PRIOR 是標(biāo)示父子關(guān)系的對應(yīng)!

          如下例子:

          view plaincopy to clipboardprint?
          select max(  
          substr(  
          sys_connect_by_path(column_name,',')  
          ,2)  
          )  
          from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')  
          start with rn=1 connect by rn=rownum ; 
          select max(
          substr(
          sys_connect_by_path(column_name,',')
          ,2)
          )
          from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')
          start with rn=1 connect by rn=rownum ;

           

          是將列用,進行分割成為一行,然后將首個,去掉,只取取最大的那個數(shù)據(jù)。

          ---------------------------------------------

          下面是別人的例子:

          1、帶層次關(guān)系

          view plaincopy to clipboardprint?
          SQL> create table dept(deptno number,deptname varchar2(20),mgrno number);  
           
          Table created.  
           
          SQL> insert into dept values(1,'總公司',null);  
           
          1 row created.  
           
          SQL> insert into dept values(2,'浙江分公司',1);  
           
          1 row created.  
           
          SQL> insert into dept values(3,'杭州分公司',2);  
           
          1 row created.  
           
          SQL> commit;  
           
          Commit complete.  
           
          SQL> select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;  
           
          MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))  
          --------------------------------------------------------------------------------  
          總公司,浙江分公司,杭州分公司 
          SQL> create table dept(deptno number,deptname varchar2(20),mgrno number);

          Table created.

          SQL> insert into dept values(1,'總公司',null);

          1 row created.

          SQL> insert into dept values(2,'浙江分公司',1);

          1 row created.

          SQL> insert into dept values(3,'杭州分公司',2);

          1 row created.

          SQL> commit;

          Commit complete.

          SQL> select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;

          MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))
          --------------------------------------------------------------------------------
          總公司,浙江分公司,杭州分公司

          2、行列轉(zhuǎn)換


          如把一個表的所有列連成一行,用逗號分隔:

          view plaincopy to clipboardprint?
          SQL> select max(substr(sys_connect_by_path(column_name,','),2))  
          from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')  
          start with rn=1 connect by rn=rownum ;  
           
          MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))  
          --------------------------------------------------------------------------------  
          DEPTNO,DEPTNAME,MGRNO 

          posted on 2011-08-05 11:03 xzc 閱讀(1406) 評論(3)  編輯  收藏 所屬分類: Oracle

          評論:
          # re: SYS_CONNECT_BY_PATH函數(shù)用法 ORACLE 2011-08-05 11:06 | xzc
          SQL> select substr(max(sys_connect_by_path(attr_value, ',')), 2)
          2 from (select attr_value, rownum rn
          3 from attribute_value
          4 where attr_id in
          5 (select attr_id from attribute where attr_code = 'lan_id'))
          6 start with rn = 1
          7 connect by rn = rownum;

          SUBSTR(MAX(SYS_CONNECT_BY_PATH
          --------------------------------------------------------------------------------
          470,471,472,473,474,475,476,477,478,479,482,483  回復(fù)  更多評論
            
          # re: SYS_CONNECT_BY_PATH函數(shù)用法 ORACLE 2011-08-05 11:09 | xzc
          select max(substr(sys_connect_by_path(column_name, ','), 2))
          from (select column_name, rownum rn
          from user_tab_columns
          where table_name = 'DEPT')
          start with rn = 1
          connect by rn = rownum;

          select substr(max(sys_connect_by_path(attr_value, ',')), 2)
          from (select attr_value, rownum rn
          from attribute_value
          where attr_id in
          (select attr_id from attribute where attr_code = 'lan_id'))
          start with rn = 1
          connect by rn = rownum;  回復(fù)  更多評論
            
          # re: SYS_CONNECT_BY_PATH函數(shù)用法 ORACLE 2012-07-12 21:22 | xzc
          SQL> select wm_concat(lan_id) from rr_lan;

          WM_CONCAT(LAN_ID)
          --------------------------------------------------------------------------------
          471,470,472,473,474,475,476,477,478,479,482,483  回復(fù)  更多評論
            
          主站蜘蛛池模板: 江北区| 沙田区| 丹凤县| 长岛县| 昔阳县| 绍兴县| 玉田县| 全椒县| 白山市| 西畴县| 墨脱县| 大方县| 金川县| 绥阳县| 万年县| 宣城市| 英吉沙县| 招远市| 宁晋县| 万山特区| 兰考县| 和平区| 扶余县| 夹江县| 清镇市| 景宁| 武胜县| 观塘区| 镶黄旗| 社旗县| 谢通门县| 磐安县| 丹江口市| 哈巴河县| 朝阳市| 贵溪市| 高青县| 建阳市| 监利县| 咸丰县| 青神县|