隨筆-314  評(píng)論-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
           


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

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

          CONNECT BY PRIOR 是標(biāo)示父子關(guān)系的對(duì)應(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 ;

           

          是將列用,進(jìn)行分割成為一行,然后將首個(gè),去掉,只取取最大的那個(gè)數(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)換


          如把一個(gè)表的所有列連成一行,用逗號(hào)分隔:

          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) 評(píng)論(3)  編輯  收藏 所屬分類: Oracle

          評(píng)論:
          # 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ù)  更多評(píng)論
            
          # 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ù)  更多評(píng)論
            
          # 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ù)  更多評(píng)論
            
          主站蜘蛛池模板: 黄平县| 江孜县| 安康市| 绥芬河市| 鄂托克前旗| 邵阳县| 辽阳县| 崇义县| 遂宁市| 迭部县| 铁岭市| 盘山县| 咸丰县| 普定县| 九寨沟县| 安龙县| 金川县| 武宣县| 祁阳县| 靖西县| 沁阳市| 抚顺市| 长阳| 吉隆县| 合川市| 永修县| 西青区| 布拖县| 杭州市| 科尔| 民权县| 吉林省| 中西区| 焦作市| 扎囊县| 扎兰屯市| 武汉市| 临沧市| 阜康市| 安图县| 密山市|