简单的Oracle的树分级查询

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值