您好,登錄后才能下訂單哦!
樹結構層次關系即父子關系,類似公司中的部門組織結構樹
其中總經理是最大的父節點,下面有助理、市場部、行政辦、研發部等子節點,而研發部又細分為研發一部和研發二部;
如hr用戶表employees中的employee_id和manager_id。employee_id表示該雇員的編號,manager_id表示領導該雇員的人的編號,即子節點的manager_id值等于父節點的employee_id值。在表的每一行中都有一個表示父節點的manager_id(除根節點外),通過每個節點的父節點,就可以確定整個樹結構。
在SELECT命令中使用CONNECT BY 和藹START WITH 子句可以查詢表中的樹型結構關系。其命令格式如下:
SELECT 。。。
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}
[START WITH];
其中:CONNECT BY子句說明每行數據將是按層次順序檢索,并規定將表中的數據連入樹型結構的關系中。PRIORY運算符必須放置在連接關系的兩列中某一個的前面。對于節點間的父子關系,PRIOR運算符在的一側表示父節點,另一側表示子節點,從而確定查找樹結構是的順序是自頂向下還是自底向上。在連接關系中,除了可以使用列名外,還允許使用列表達式。
START WITH 子句為可選項,用來標識哪個節點作為查找樹型結構的根(起始)節點。若該子句被省略,則表示所有滿足查詢條件的行作為根節點。
START WITH:不但可以指定一個根節點,還可以指定多個根節點。
學習之前,讓我們首先對于樹結構章節會使用到的關鍵詞有個概念上的認識和理解!
prior:優先的
STARTWITH:指定遍歷的起點
CONNECT BY PRIOR:指定遍歷的順序,比如從上到下,從下到上
CONNECT BY NOCYCLE PRIOR:不進行循環遍歷,可以避免死循環情況的發生
SYS_CONNECT_BY_PRTH:函數,用于指定層次分隔符
CONNECT_BY_ISLEAF:函數,返回0和1兩個值,0代表非末級節點,即下面還有子節點;1代表最末級節點,即下面不再有子節點
據上面的關鍵字我們來組合一條sql語句:顯示employees表中的用戶的隸屬關系,類似總經理/副總經理/行政辦主任/辦事員......
我們使用START WITH語句來指定遍歷的源頭,即從哪里開始,START WITH可以省略,如果省略則表示所有滿足查詢條件的行作為根節點
CONNECT BY PRIOR用來指定遍歷的順序,等號的兩端連接的是父子關系,即是從老子開始找兒子,還是從兒子開始找老子......
e.employee_id=e.manager_id的意思是:首先找到員工的信息,然后再去找上級是這個員工的,這就是從上至下
關于LEVEL:LEVEL需要與CONNECT BY 配合使用,表示樹狀結構的層級,LEVEL是Oracle保留關鍵字
--例1:下面的sql語句是上至下進行員工遍歷顯示,層次結構使用/進行分割
SQL>SELECTLPAD(' ', 2 * LEVEL - 1) || SYS_CONNECT_BY_PATH(e.last_name, '/') AS path
FROMemployees e
STARTWITH e.manager_id IS NULL
CONNECT BY PRIORe.employee_id = e.manager_id
--例2:查找由FORD和BLAKE 領導的所有雇員的信息。
SQL>SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME IN(’FORD’,’BLAKE’);
EMPNO ENAME MGR
——————————————————————————
7698 BLAKE 7839
7499 ALLEN 7698
7521 WARD 7698
7654 MARTIN 7698
例3:樹結構結果集中不包含Hartstein的樹狀關系,我們可以這樣實現
SQL>SELECTLPAD(' ', 2 * LEVEL - 1) || SYS_CONNECT_BY_PATH(e.last_name, '/') AS path
FROM employees e
START WITHe.manager_id IS NULL
CONNECT BY PRIORe.employee_id = e.manager_id
AND e.last_name <> 'Hartstein'
說明:通過在CONNECT BY 子句后面加AND關鍵字的方式進行條件篩選
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。