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

          SELECT ename  
          FROM scott.emp   
          START WITH ename = 'KING'   
          CONNECT BY PRIOR empno = mgr;   
           
          --得到結果為:  
           
          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;  
           
           
           
          --得到結果為:  
           
           
           
          >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;

          --得到結果為:

          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;

           

          --得到結果為:

           

          >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這個函數是oracle9i才新提出來的!
          它一定要和connect by子句合用!
          第一個參數是形成樹形式的字段,第二個參數是父級和其子級分隔顯示用的分隔符!

          START WITH 代表你要開始遍歷的的節點!

          CONNECT BY PRIOR 是標示父子關系的對應!

          如下例子:

          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 ;

           

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

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

          下面是別人的例子:

          1、帶層次關系

          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、行列轉換


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

          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函數用法 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  回復  更多評論
            
          # re: SYS_CONNECT_BY_PATH函數用法 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;  回復  更多評論
            
          # re: SYS_CONNECT_BY_PATH函數用法 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  回復  更多評論
            
          主站蜘蛛池模板: 陇川县| 扎鲁特旗| 特克斯县| 兴城市| 郎溪县| 磐石市| 万全县| 梧州市| 莫力| 太湖县| 东平县| 丘北县| 休宁县| 鹰潭市| 樟树市| 德安县| 新河县| 柳河县| 博野县| 大港区| 涪陵区| 双流县| 抚州市| 河东区| 仁布县| 商城县| 封丘县| 牡丹江市| 枞阳县| 德江县| 丰宁| 石台县| 广东省| 沿河| 察哈| 武清区| 大宁县| 寿宁县| 福清市| 敦化市| 舞阳县|