简单的树形查询--prior放在select中使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/S630730701/article/details/79103209

简单的树形查询

使用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,可以试试下面的地址:

scott学习环境


猜你喜欢

转载自blog.csdn.net/S630730701/article/details/79103209