oracle中的分级查询
下面以emp表和dept表为例。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
14 rows selected
SQL> select * from dept;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
Oracle提供其他数据库没有的分级查询操作:
例如:希望通过某个员工回溯它的所有上级,包括上级的上级
select level,lpad(' ',level-1) ||empno empno,ename,mgr,deptno from emp start with empno=7369 connect by empno = prior mgr;
备注:
level是oracle关键字表示分级级别,其中lpad(' ',level-1)函数是根据level是值生成level-1个空格。
运行结果如下图所示:
又如:希望通过一次查询以树状结构显示emp表中所有的上下级关系
select level,lpad(' ',level-1) ||empno empno,ename,mgr,deptno from emp start with empno connect by prior empno = mgr;
运行结果去我看我的相册 o01.png, 由于空间的容量有限