Oracle樹(shù)結(jié)構(gòu)

樹(shù)結(jié)構(gòu)層次關(guān)系即父子關(guān)系,類似公司中的部門組織結(jié)構(gòu)樹(shù)

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比橋西網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式橋西網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋橋西地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

Oracle樹(shù)結(jié)構(gòu)

其中總經(jīng)理是最大的父節(jié)點(diǎn),下面有助理、市場(chǎng)部、行政辦、研發(fā)部等子節(jié)點(diǎn),而研發(fā)部又細(xì)分為研發(fā)一部和研發(fā)二部;

如hr用戶表employees中的employee_id和manager_id。employee_id表示該雇員的編號(hào),manager_id表示領(lǐng)導(dǎo)該雇員的人的編號(hào),即子節(jié)點(diǎn)的manager_id值等于父節(jié)點(diǎn)的employee_id值。在表的每一行中都有一個(gè)表示父節(jié)點(diǎn)的manager_id(除根節(jié)點(diǎn)外),通過(guò)每個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),就可以確定整個(gè)樹(shù)結(jié)構(gòu)。

在SELECT命令中使用CONNECT BY和藹START WITH子句可以查詢表中的樹(shù)型結(jié)構(gòu)關(guān)系。其命令格式如下:
SELECT。。。
CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR裂名2}
[START WITH];
其中:CONNECT BY子句說(shuō)明每行數(shù)據(jù)將是按層次順序檢索,并規(guī)定將表中的數(shù)據(jù)連入樹(shù)型結(jié)構(gòu)的關(guān)系中。PRIORY運(yùn)算符必須放置在連接關(guān)系的兩列中某一個(gè)的前面。對(duì)于節(jié)點(diǎn)間的父子關(guān)系,PRIOR運(yùn)算符在的一側(cè)表示父節(jié)點(diǎn),另一側(cè)表示子節(jié)點(diǎn),從而確定查找樹(shù)結(jié)構(gòu)是的順序是自頂向下還是自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達(dá)式。

START WITH子句為可選項(xiàng),用來(lái)標(biāo)識(shí)哪個(gè)節(jié)點(diǎn)作為查找樹(shù)型結(jié)構(gòu)的根(起始)節(jié)點(diǎn)。若該子句被省略,則表示所有滿足查詢條件的行作為根節(jié)點(diǎn)。
START WITH:不但可以指定一個(gè)根節(jié)點(diǎn),還可以指定多個(gè)根節(jié)點(diǎn)。

 

學(xué)習(xí)之前,讓我們首先對(duì)于樹(shù)結(jié)構(gòu)章節(jié)會(huì)使用到的關(guān)鍵詞有個(gè)概念上的認(rèn)識(shí)和理解!

      prior:優(yōu)先的

      STARTWITH:指定遍歷的起點(diǎn)

     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兩個(gè)值,0代表非末級(jí)節(jié)點(diǎn),即下面還有子節(jié)點(diǎn);1代表最末級(jí)節(jié)點(diǎn),即下面不再有子節(jié)點(diǎn)

 

據(jù)上面的關(guān)鍵字我們來(lái)組合一條sql語(yǔ)句:顯示employees表中的用戶的隸屬關(guān)系,類似總經(jīng)理/副總經(jīng)理/行政辦主任/辦事員......

我們使用START WITH語(yǔ)句來(lái)指定遍歷的源頭,即從哪里開(kāi)始,START WITH可以省略,如果省略則表示所有滿足查詢條件的行作為根節(jié)點(diǎn)

CONNECT BY PRIOR用來(lái)指定遍歷的順序,等號(hào)的兩端連接的是父子關(guān)系,即是從老子開(kāi)始找兒子,還是從兒子開(kāi)始找老子......

e.employee_id=e.manager_id的意思是:首先找到員工的信息,然后再去找上級(jí)是這個(gè)員工的,這就是從上至下

關(guān)于LEVEL:LEVEL需要與CONNECT BY配合使用,表示樹(shù)狀結(jié)構(gòu)的層級(jí),LEVEL是Oracle保留關(guān)鍵字

--例1:下面的sql語(yǔ)句是上至下進(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:樹(shù)結(jié)構(gòu)結(jié)果集中不包含Hartstein的樹(shù)狀關(guān)系,我們可以這樣實(shí)現(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'

說(shuō)明:通過(guò)在CONNECT BY子句后面加AND關(guān)鍵字的方式進(jìn)行條件篩選

當(dāng)前名稱:Oracle樹(shù)結(jié)構(gòu)
本文URL:http://muchs.cn/article26/jpdecg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站策劃、網(wǎng)站改版動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作