select ... from tablename start with cond1
connect by cond2
where cond3;
简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中COND1是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
COND2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。
COND3是过滤条件,用于对返回的所有记录进行过滤。
connect by后面的prior如果缺省,则只能查到符合条件其实行,并不进行递归查询,connect by prior后面
所放的字段知名了查询方向。
========================================================
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
14 rows selected.
通过子节点像根节点追朔
SQL> select empno,ename,mgr from emp start with empno=7698 connect by prior mgr=empno;
EMPNO ENAME MGR
---------- -------------------- ----------
7698 BLAKE 7839
7839 KING
通过根节点详子节点追朔
SQL> select empno,ename,mgr from emp start with empno=7698 connect by prior empno=mgr;
EMPNO ENAME MGR
---------- -------------------- ----------
7698 BLAKE 7839
7499 ALLEN 7698
7521 WARD 7698
7654 MARTIN 7698
7844 TURNER 7698
7900 JAMES 7698
通过level关键字查询所在层次:
SQL> select empno,ename,mgr,level from emp start with empno=7698 connect by prior empno=mgr;
EMPNO ENAME MGR LEVEL
---------- -------------------- ---------- ----------
7698 BLAKE 7839 1
7499 ALLEN 7698 2
7521 WARD 7698 2
7654 MARTIN 7698 2
7844 TURNER 7698 2
7900 JAMES 7698 2
6 rows selected.
SQL> select empno,ename,mgr,level from emp start with empno=7698 connect by prior mgr=empno;
EMPNO ENAME MGR LEVEL
---------- -------------------- ---------- ----------
7698 BLAKE 7839 1
7839 KING 2
----------------------------------------------------------------------------------------------------------
connect by后面的prior如果缺省,则只能查到符合条件其实行,并不进行递归查询,connect by prior后面
所放的字段知名了查询方向。
SQL> select empno,ename,mgr,level from emp start with empno=7698 connect by empno=mgr;
EMPNO ENAME MGR LEVEL
---------- -------------------- ---------- ----------
7698 BLAKE 7839 1