層次查詢的概念
語法格式:
select [level],column, expr... from table
[where condition]
start with condition
connect by [prior column1= column2 |
column1 = prior column2];
層次查詢是通過start with和connect by子句標識的:
1、其中level關鍵字是可選的,表示等級,1表示root,2表示root的child,其他相同的規則。
2、From之後可以是table,view但是隻能是一個table。
3、Where條件限制了查詢返回的行,但是不影響層次關係,屬於將節點截斷,但是這個被截斷的節點的下層child不受影響。
4、Start with是表示開始節點,對於一個真實的層次關係,必須要有這個子句,但是不是必須的。
5、connect by prior是指定父子關係,其中prior的位置不一定要在connect by之後,對於一個真實的層次關係,這也是必須的。
示例:在自連接中,數據量大的話會出現笛卡爾集的情況
SQL> --通過表的別名,將同一張表視爲多張表
SQL> select e.ename||'的老闆是'||b.ename
2 from emp e,emp b
3 where e.mgr=b.empno;
結果:
爲了避免這種情況的發生,就使用Oracle當中的層次查詢,那下面呢,我就這張圖畫一張樹形關係圖
層次查詢示例:
SQL> --執行層次查詢
SQL> select level,empno,ename,mgr
2 from emp
3 connect by prior empno=mgr
4 start with mgr is null
5 order by 1;
結果: