ITPub博客

首页 > 数据库 > Oracle > connect by 用法汇总

connect by 用法汇总

原创 Oracle 作者:pwz1688 时间:2014-01-10 17:11:21 0 删除 编辑
connect by可实现多种功能,如下:
1、列出上下级关系;
2、构造序列;
3、实现排列组合;
先看connect by 官方语法,下图示:

下面举例分析connect by 实现各种功能用法。
一、列出上下级关系
附上测试脚本如下:

点击(此处)折叠或打开

  1. SQL> drop table emp;

  2. 表已删除。

  3. SQL> create table emp(
  4.   2 empno number(10),
  5.   3 ename varchar2(20),
  6.   4 job varchar2(50),
  7.   5 mgr number(10),
  8.   6 deptno number(10))
  9.   7 ;

  10. 表已创建。

  11. SQL> insert into emp values(7839,'king','presi','',10);

  12. 已创建 1 行。

  13. SQL> insert into emp values(7566,'jones','manager','7839',20);

  14. 已创建 1 行。

  15. SQL> insert into emp values(7788,'scott','analyst','7566',20);

  16. 已创建 1 行。

  17. SQL> insert into emp values(7876,'adams','clerk','7788',20);

  18. 已创建 1 行。

  19. SQL> insert into emp values(7902,'ford','analyst','7566',20);

  20. 已创建 1 行。

  21. SQL> insert into emp values(7369,'smith','clerk','7902',20);

  22. 已创建 1 行。

  23. SQL> insert into emp values(7698,'blake','manager','7839',30);

  24. 已创建 1 行。

  25. SQL> insert into emp values(7499,'allen','salesman','7698',30);

  26. 已创建 1 行。

  27. SQL> insert into emp values(7521,'ward','salesman','7698',30);

  28. 已创建 1 行。

  29. SQL> insert into emp values(7654,'martin','salesman','7698',30);

  30. 已创建 1 行。

  31. SQL> insert into emp values(7844,'turner','salesman','7698',30);

  32. 已创建 1 行。

  33. SQL> insert into emp values(7900,'james','clerk','7698',30);

  34. 已创建 1 行。

  35. SQL> insert into emp values(7782,'clark','manager','7839',10);

  36. 已创建 1 行。

  37. SQL> insert into emp values(7934,'miller','clerk','7782',10);

  38. 已创建 1 行。

  39. SQL> commit;

  40. 提交完成。

  41. SQL> select * from emp;

  42.  

         EMPNO ENAME      JOB                         MGR     DEPTNO
    ---------- ---------- -------------------- ---------- ----------
          7839 king       presi                                   10
          7566 jones      manager                    7839         20
          7788 scott      analyst                    7566         20
          7876 adams      clerk                      7788         20
          7902 ford       analyst                    7566         20
          7369 smith      clerk                      7902         20
          7698 blake      manager                    7839         30
          7499 allen      salesman                   7698         30
          7521 ward       salesman                   7698         30
          7654 martin     salesman                   7698         30
          7844 turner     salesman                   7698         30

         EMPNO ENAME      JOB                         MGR     DEPTNO
    ---------- ---------- -------------------- ---------- ----------
          7900 james      clerk                      7698         30
          7782 clark      manager                    7839         10
          7934 miller     clerk                      7782         10

    已选择14行。


  43. SQL> select t.*,level from emp t
  44.   2 start with mgr is null
  45.   3 connect by prior empno=mgr;

  46.  

         EMPNO ENAME      JOB                         MGR     DEPTNO      LEVEL
    ---------- ---------- -------------------- ---------- ---------- ----------
          7839 king       presi                                   10          1
          7566 jones      manager                    7839         20          2
          7788 scott      analyst                    7566         20          3
          7876 adams      clerk                      7788         20          4
          7902 ford       analyst                    7566         20          3
          7369 smith      clerk                      7902         20          4
          7698 blake      manager                    7839         30          2
          7499 allen      salesman                   7698         30          3
          7521 ward       salesman                   7698         30          3
          7654 martin     salesman                   7698         30          3
          7844 turner     salesman                   7698         30          3

         EMPNO ENAME      JOB                         MGR     DEPTNO      LEVEL
    ---------- ---------- -------------------- ---------- ---------- ----------
          7900 james      clerk                      7698         30          3
          7782 clark      manager                    7839         10          2
          7934 miller     clerk                      7782         10          3

    已选择14行。


  47. SQL> column ename format a20

  48. SQL> edit
  49. 已写入 file afiedt.buf

  50.   1 select t.empno,lpad(' ',level*2-1,' ')||ename ename,
  51.   2 job,mgr,deptno,level from emp t
  52.   3 start with mgr is null
  53.   4* connect by prior empno=mgr
  54. SQL> /

         EMPNO ENAME                JOB                    MGR     DEPTNO LEVEL
    ---------- -------------------- --------------- ---------- ---------- -----
          7839  king                presi                              10     1
          7566    jones             manager               7839         20     2
          7788      scott           analyst               7566         20     3
          7876        adams         clerk                 7788         20     4
          7902      ford            analyst               7566         20     3
          7369        smith         clerk                 7902         20     4
          7698    blake             manager               7839         30     2
          7499      allen           salesman              7698         30     3
          7521      ward            salesman              7698         30     3
          7654      martin          salesman              7698         30     3
          7844      turner          salesman              7698         30     3

         EMPNO ENAME                JOB                    MGR     DEPTNO LEVEL
    ---------- -------------------- --------------- ---------- ---------- -----
          7900      james           clerk                 7698         30     3
          7782    clark             manager               7839         10     2
          7934      miller          clerk                 7782         10     3

    已选择14行。


  55. SQL>
注:上面代码中lpad挂号内的''一定要是一个空格' '。

二、构造序列
可利用rownum,level等伪例结合connect by构造序列,如下代码示:

点击(此处)折叠或打开

  1. SQL> select level from dual connect by level<5;

  2. LEVEL
  3. -----

  4.     1
  5.     2
  6.     3
  7.     4

  8. SQL> select rn from dual connect by rn<5;
  9. select rn from dual connect by rn<5
  10.                                *
  11. 第 1 行出现错误:
  12. ORA-00904: "RN": 标识符无效


  13. SQL> select rownum rn from dual connect by rownum<5;

  14.         RN
  15. ----------

  16.          1
  17.          2
  18.          3
  19.          4

  20. SQL>
三、排列组合
组合:从n个不同元素里取r个元素,其可能的组合为:

点击(此处)折叠或打开

  1. SQL> edit
  2. 已写入 file afiedt.buf

  3.   1 with t as
  4.   2 (select rownum rn from dual connect by level<&n+1)
  5.   3 select connect_by_root(rn) rrn,rn,level,
  6.   4 sys_connect_by_path(rn,',') xmlpath
  7.   5 from t
  8.   6 where level=&r
  9.   7* connect by rn<prior rn
  10. SQL> /
  11. 输入 n 的值: 3
  12. 原值 2: (select rownum rn from dual connect by level<&n+1)
  13. 新值 2: (select rownum rn from dual connect by level<3+1)
  14. 输入 r 的值: 2
  15. 原值 6: where level=&r
  16. 新值 6: where level=2

  17.        RRN RN LEVEL XMLPATH
  18. ---------- ---------- ---------- ---------------

  19.          2 1 2 ,2,1
  20.          3 1 2 ,3,1
  21.          3 2 2 ,3,2

如果要求所有组合,就去掉上面代码中的where条件部分内容。
排列:

点击(此处)折叠或打开

  1. SQL> edit
  2. 已写入 file afiedt.buf

  3.   1 with t as
  4.   2 (select rownum rn from dual connect by level<4)
  5.   3 select connect_by_root(rn) rrn,rn,level,
  6.   4 sys_connect_by_path(rn,',') xmlpath
  7.   5 from t
  8.   6 connect by nocycle rn<>prior rn
  9.   7* order by level,2
  10. SQL> /

  11.        RRN RN LEVEL XMLPATH
  12. ---------- ---------- ---------- ---------------

  13.          1 1 1 ,1
  14.          2 2 1 ,2
  15.          3 3 1 ,3
  16.          3 1 2 ,3,1
  17.          2 1 2 ,2,1
  18.          1 2 2 ,1,2
  19.          3 2 2 ,3,2
  20.          2 3 2 ,2,3
  21.          1 3 2 ,1,3
  22.          2 1 3 ,2,3,1
  23.          3 1 3 ,3,2,1

  24.        RRN RN LEVEL XMLPATH
  25. ---------- ---------- ---------- ---------------

  26.          3 2 3 ,3,1,2
  27.          1 2 3 ,1,3,2
  28.          2 3 3 ,2,1,3
  29.          1 3 3 ,1,2,3

  30. 已选择15行。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1069342/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736029