Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28622
  • 博文数量: 14
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-27 04:53
文章分类

全部博文(14)

文章存档

2013年(14)

我的朋友

分类: Oracle

2013-08-01 22:32:38



  1. SYS_CONNECT_BY_PATH 函数用法


  2.  SELECT ename
  3.    FROM emp
  4.   START WITH ename = 'KING'
  5. CONNECT BY PRIOR empno = mgr;
  6.                                                
  7. ENAME
  8. ----------
  9. KING
  10. JONES
  11. SCOTT
  12. ADAMS
  13. FORD
  14. SMITH
  15. BLAKE
  16. ALLEN
  17. WARD
  18. MARTIN
  19. TURNER
  20. JAMES
  21. CLARK
  22. MILLER
  23.                                                
  24. 14 rows selected.



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

  29. Path
  30. ---------------------------------------------
  31. >KING
  32. >KING>JONES
  33. >KING>JONES>SCOTT
  34. >KING>JONES>SCOTT>ADAMS
  35. >KING>JONES>FORD
  36. >KING>JONES>FORD>SMITH
  37. >KING>BLAKE
  38. >KING>BLAKE>ALLEN
  39. >KING>BLAKE>WARD
  40. >KING>BLAKE>MARTIN
  41. >KING>BLAKE>TURNER
  42. >KING>BLAKE>JAMES
  43. >KING>CLARK
  44. >KING>CLARK>MILLER

  45. 14 rows selected.


  46. SYS_CONNECT_BY_PATH 函数是oracle 9i才新提出来的. 它一定要和 connect by 子句合用.
  47. 第一个参数是形成树形式的字段, 第二个参数是父级和其子级分隔显示用的分隔符.

  48. START WITH 代表要开始遍历的的节点.

  49. CONNECT BY PRIOR 表示父子关系的对应

  50. 例子:

  51.  select max(substr(sys_connect_by_path(column_name,','),2))
  52.    from (
  53.          select column_name,rownum rn
  54.            from user_tab_columns
  55.           where table_name ='AA_TEST'
  56.         )
  57.   start with rn=1
  58. connect by rn=rownum ;


  59. 将列进行分割成为一行, 然后将首个去掉, 只取最大的那个数据.

  60. ---------------------------------------------

  61. 例子:

  62. 1. 带层次关系


  63. SQL> create table dept(deptno number,deptname varchar2(20),mgrno number);

  64. Table created.

  65. SQL> insert into dept values(1,'Head office',null);

  66. 1 row created.

  67. SQL> insert into dept values(2,'zhejiang branch',1);

  68. 1 row created.

  69. SQL> insert into dept values(3,'hangzhou branch',2);

  70. 1 row created.

  71. SQL> commit;

  72. Commit complete.

  73.  select max(substr(sys_connect_by_path(deptname,','),2))
  74.    from dept
  75. connect by prior deptno=mgrno
  76. /

  77. MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))
  78. -----------------------------------------------------------
  79. zhejiang branch,hangzhou branch


  80.  select max(substr(sys_connect_by_path(deptname, ','),2))
  81.    from dept
  82.   start with deptname = 'Head office'
  83. connect by prior deptno = mgrno
  84. /

  85. MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))
  86. -----------------------------------------------------------
  87. Head office,zhejiang branch,hangzhou branch




  88. 2. 行列转换

  89. 如把一个表的所有列连成一行, 用逗号分隔:

  90.  select max(substr(sys_connect_by_path(column_name,','),2))
  91.    from (
  92.          select column_name,rownum rn
  93.            from user_tab_columns
  94.           where table_name ='DEPT'
  95.         )
  96.   start with rn=1
  97. connect by rn=rownum ;

  98. MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))
  99. --------------------------------------------------------
  100. DEPTNO,DEPTNAME,MGRNO


 select deptno,
        ltrim(sys_connect_by_path(ename, ','),',') emps 
   from (
          select deptno,
                 ename, 
                 row_number() over(partition by deptno order by empno) rn,
                 count(*) over(partition by deptno) cnt
            from emp
        )
  where level = cnt
  start with rn = 1
connect by prior deptno = deptno
    and prior rn = rn - 1


    DEPTNO EMPS
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 SMITH,JONES,SCOTT,ADAMS,FORD
        30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES




阅读(4629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~