如今有一個需求: 算法
在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指從樹的哪一個深度或者說哪一個節點開始查詢。