如今有一个需求: 算法
在emp表中查询员工信息: ***的老板是*** sql
若是使用自链接,天然很容易就能查出结果。 性能
sql语句: code
select e.ename||'的老板是'||b.ename from emp e,emp b where e.mgr=b.empno;结果以下:
E.ENAME||'的老板是'||B.ENAME ---------------------------- FORD的老板是JONES SCOTT的老板是JONES JAMES的老板是BLAKE TURNER的老板是BLAKE MARTIN的老板是BLAKE WARD的老板是BLAKE ALLEN的老板是BLAKE MILLER的老板是CLARK ADAMS的老板是SCOTT CLARK的老板是KING BLAKE的老板是KING E.ENAME||'的老板是'||B.ENAME ---------------------------- JONES的老板是KING SMITH的老板是FORD可是若是这张表有上千万,上亿条记录呢。这时产生的笛卡尔集将会很是大,明显影响系统性能。
因此这时候就须要使用层次查询。 it
若是将上面的结果组织一下的话,能够得出下面这张图: io
能够看出这是一个树,level指树的深度。 class
在层次查询只能有一张表,而且再也不是表和表的链接了,而是同一张表的先后两次操做。从表面上看咱们对这张表操做了屡次,实际上内部算法只是对这张表操做了一次。 select
使用层次查询解决这个需求的话,sql语句就是: sql语句
select level,empno,ename,mgr from emp connect by prior empno=mgr start with mgr is null order by 1;connect by表示后一次操做的某列值等于前一次操做的某列值,start with指从树的哪一个深度或者说哪一个节点开始查询。