Oracle查詢之層次查詢示例

如今有一個需求: 算法

        在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指從樹的哪一個深度或者說哪一個節點開始查詢。
相關文章
相關標籤/搜索