简单的树形查询
使用scott用户下的表:emp
想要查出上级主管的姓名(sql1):
select e.empno as "员工编码",
e.ename as "员工姓名",
e.mgr as "主管编码",
"主管姓名" as "主管姓名"
from emp e
start with e.empno = 7566
connect by (prior e.empno) = e.mgr
order by 1;
查询之后主管姓名要如何展示出来呢,想想可以再关联一次emp查出姓名代码入戏(sql2):
select e.empno as "员工编码",
e.ename as "员工姓名",
e.mgr as "主管编码",
b.ename as "主管姓名"
from emp e left join emp b on e.mgr = b.empno
start with e.empno = 7566
connect by (prior e.empno) = e.mgr
order by 1;
看看执行计划:
Plan Hash Value : 1231760462
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 560 | 8 | 00:00:01 |
| 1 | SORT ORDER BY | | 14 | 560 | 8 | 00:00:01 |
| * 2 | CONNECT BY NO FILTERING WITH START-WITH | | | | | |
| * 3 | HASH JOIN OUTER | | 14 | 336 | 7 | 00:00:01 |
| 4 | TABLE ACCESS FULL | EMP | 14 | 196 | 3 | 00:00:01 |
| 5 | TABLE ACCESS FULL | EMP | 14 | 140 | 3 | 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("E"."MGR"=PRIOR "E"."EMPNO")
* 2 - filter("E"."EMPNO"=7566)
* 3 - access("E"."MGR"="B"."EMPNO"(+))
有个更简单的方法查出主管的姓名(sql3):
select e.empno as "员工编码",
e.ename as "员工姓名",
e.mgr as "主管编码",
prior e.ename as "主管姓名"
from emp e
start with e.empno = 7566
connect by (prior e.empno) = e.mgr
order by 1;
查看执行计划:
Plan Hash Value : 2173065311
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 462 | 4 | 00:00:01 |
| 1 | SORT ORDER BY | | 14 | 462 | 4 | 00:00:01 |
| * 2 | CONNECT BY NO FILTERING WITH START-WITH | | | | | |
| 3 | TABLE ACCESS FULL | EMP | 14 | 196 | 3 | 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("E"."MGR"=PRIOR "E"."EMPNO")
* 2 - filter("E"."EMPNO"=7566)
是不是快了很多。
总结:之前一直认为prior 只用在 connect by 后面,没想到也可以用在select 里。
如果没有oracle环境执行sql,可以试试下面的地址: