樹結(jié)構(gòu)層次關(guān)系即父子關(guān)系,類似公司中的部門組織結(jié)構(gòu)樹
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比橋西網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式橋西網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋橋西地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
其中總經(jīng)理是最大的父節(jié)點,下面有助理、市場部、行政辦、研發(fā)部等子節(jié)點,而研發(fā)部又細(xì)分為研發(fā)一部和研發(fā)二部;
如hr用戶表employees中的employee_id和manager_id。employee_id表示該雇員的編號,manager_id表示領(lǐng)導(dǎo)該雇員的人的編號,即子節(jié)點的manager_id值等于父節(jié)點的employee_id值。在表的每一行中都有一個表示父節(jié)點的manager_id(除根節(jié)點外),通過每個節(jié)點的父節(jié)點,就可以確定整個樹結(jié)構(gòu)。
在SELECT命令中使用CONNECT BY和藹START WITH子句可以查詢表中的樹型結(jié)構(gòu)關(guān)系。其命令格式如下:
SELECT。。。
CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR裂名2}
[START WITH];
其中:CONNECT BY子句說明每行數(shù)據(jù)將是按層次順序檢索,并規(guī)定將表中的數(shù)據(jù)連入樹型結(jié)構(gòu)的關(guān)系中。PRIORY運算符必須放置在連接關(guān)系的兩列中某一個的前面。對于節(jié)點間的父子關(guān)系,PRIOR運算符在的一側(cè)表示父節(jié)點,另一側(cè)表示子節(jié)點,從而確定查找樹結(jié)構(gòu)是的順序是自頂向下還是自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達(dá)式。
START WITH子句為可選項,用來標(biāo)識哪個節(jié)點作為查找樹型結(jié)構(gòu)的根(起始)節(jié)點。若該子句被省略,則表示所有滿足查詢條件的行作為根節(jié)點。
START WITH:不但可以指定一個根節(jié)點,還可以指定多個根節(jié)點。
學(xué)習(xí)之前,讓我們首先對于樹結(jié)構(gòu)章節(jié)會使用到的關(guān)鍵詞有個概念上的認(rèn)識和理解!
prior:優(yōu)先的
STARTWITH:指定遍歷的起點
CONNECT BY PRIOR:指定遍歷的順序,比如從上到下,從下到上
CONNECT BY NOCYCLE PRIOR:不進(jìn)行循環(huán)遍歷,可以避免死循環(huán)情況的發(fā)生
SYS_CONNECT_BY_PRTH:函數(shù),用于指定層次分隔符
CONNECT_BY_ISLEAF:函數(shù),返回0和1兩個值,0代表非末級節(jié)點,即下面還有子節(jié)點;1代表最末級節(jié)點,即下面不再有子節(jié)點
據(jù)上面的關(guān)鍵字我們來組合一條sql語句:顯示employees表中的用戶的隸屬關(guān)系,類似總經(jīng)理/副總經(jīng)理/行政辦主任/辦事員......
我們使用START WITH語句來指定遍歷的源頭,即從哪里開始,START WITH可以省略,如果省略則表示所有滿足查詢條件的行作為根節(jié)點
CONNECT BY PRIOR用來指定遍歷的順序,等號的兩端連接的是父子關(guān)系,即是從老子開始找兒子,還是從兒子開始找老子......
e.employee_id=e.manager_id的意思是:首先找到員工的信息,然后再去找上級是這個員工的,這就是從上至下
關(guān)于LEVEL:LEVEL需要與CONNECT BY配合使用,表示樹狀結(jié)構(gòu)的層級,LEVEL是Oracle保留關(guān)鍵字
--例1:下面的sql語句是上至下進(jìn)行員工遍歷顯示,層次結(jié)構(gòu)使用/進(jìn)行分割
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 領(lǐng)導(dǎo)的所有雇員的信息。
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:樹結(jié)構(gòu)結(jié)果集中不包含Hartstein的樹狀關(guān)系,我們可以這樣實現(xiàn)
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關(guān)鍵字的方式進(jìn)行條件篩選