1、语法:
select [level],column,expr...
from table
[where condition(s)]
[start with condition(s)]
[connect by prior condition(s)];
level:对每行返回一个级别,对根行level伪列返回1;对孩子的level伪列返回2,以此类了推
start with:指定层次的根行
connct by prior:指定查询的方向
start with子句可以和任何有效的条件协同使用
start with column1=value
2、使用emp表举例实现简单的树分级:
通过一次查询实现emp表中的上下级关系:4
SQL> select level,empno,'雇员'|| ename||'的上级是:'||prior ename, mgr,deptno from emp
2 start with empno=7839 connect by prior empno = mgr
3 ;
LEVEL EMPNO '雇员'||ENAME||'的上级是:'||P MGR DEPTNO
---------- ----- ---------------------------------- ----- ------
1 7839 雇员KING的上级是: 10
2 7566 雇员JONES的上级是:KING 7839 20
3 7788 雇员SCOTT的上级是:JONES 7566 20
4 7876 雇员ADAMS的上级是:SCOTT 7788 20
3 7902 雇员FORD的上级是:JONES 7566 20
4 7369 雇员SMITH的上级是:FORD 7902 20
2 7698 雇员BLAKE的上级是:KING 7839 30
3 7499 雇员ALLEN的上级是:BLAKE 7698 30
3 7521 雇员WARD的上级是:BLAKE 7698 30
3 7654 雇员MARTIN的上级是:BLAKE 7698 30
3 7844 雇员TURNER的上级是:BLAKE 7698 30
3 7900 雇员JAMES的上级是:BLAKE 7698 30
2 7782 雇员CLARK的上级是:KING 7839 10
3 7934 雇员MILLER的上级是:CLARK 7782 10
14 rows selected
3、用level和lpad格式化分级报告
创建一个报告,显示公司的管理层,从最高级别开始,缩进下面跟随的级别
例:
SQL> select level,lpad(ename,length(ename)+(level*2)-2,'-') as org_chart
2 from emp
3 start with ename='KING'
4 connect by prior empno=mgr
5 ;
LEVEL ORG_CHART
---------- --------------------------------------------------------------------------------
1 KING
2 --JONES
3 ----SCOTT
4 ------ADAMS
3 ----FORD
4 ------SMITH
2 --BLAKE
3 ----ALLEN
3 ----WARD
3 ----MARTIN
3 ----TURNER
3 ----JAMES
2 --CLARK
3 ----MILLER
14 rows selected
4、修剪分支
1)用where子句去除一个结点
例如:where ename<>'KING'
SQL> select level,lpad(ename,length(ename)+(level*2)-2,'-') as org_chart
2 from emp where ename <>'KING'
3 start with ename='KING'
4 connect by prior empno=mgr
5 ;
LEVEL ORG_CHART
---------- --------------------------------------------------------------------------------
2 --JONES
3 ----SCOTT
4 ------ADAMS
3 ----FORD
4 ------SMITH
2 --BLAKE
3 ----ALLEN
3 ----WARD
3 ----MARTIN
3 ----TURNER
3 ----JAMES
2 --CLARK
3 ----MILLER
13 rows selected
2)用connect by子句去除一个分支
SQL> select level,lpad(ename,length(ename)+(level*2)-2,'-') as org_chart
2 from emp
3 start with ename='KING'
4 connect by prior empno=mgr and ename<>'JONES'
5 ;
LEVEL ORG_CHART
---------- --------------------------------------------------------------------------------
1 KING
2 --BLAKE
3 ----ALLEN
3 ----WARD
3 ----MARTIN
3 ----TURNER
3 ----JAMES
2 --CLARK
3 ----MILLER
9 rows selected
简单的Oracle的树分级查询
最新推荐文章于 2024-03-11 20:00:09 发布