資源描述:
《Oracle查詢樹形結(jié)構(gòu)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Oracle查詢樹形結(jié)構(gòu)oracle中的select語句可以用STARTWITH...CONNECTBYPRIOR子句實現(xiàn)遞歸查詢,connectby是結(jié)構(gòu)化查詢中用到的,其基本語法是:select*fromtablenamestartwithcond1connectbycond2wherecond3;簡單說來是將一個樹狀結(jié)構(gòu)存儲在一張表里,比如一個表中存在兩個字段:id,parentid那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結(jié)構(gòu)。用上述語法的查詢可以取得這棵樹的所有記錄。其中COND1是根結(jié)點的限定語句,當然可以放寬限定條件,以取得多個根結(jié)點,實際就
2、是多棵樹。COND2是連接條件,其中用PRIOR表示上一條記錄,比如CONNECTBYPRIORID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。COND3是過濾條件,用于對返回的所有記錄進行過濾。例:select*from(selectlevelasllevel,---層級節(jié)點l_department_id,---部門idvc_name,---部門名稱CONNECT_BY_ROOTl_department_idasdepChildrenId,--下一級部門idCONNECT_BY_ROOTvc_nameasdepChil
3、drenName,--下一級部門名稱l_type,--標記部門的分類3.管理平臺SYS_CONNECT_BY_PATH(vc_name,'/')asdepnameshowfromsys_departmentconnectbyl_department_id=priorl_parent_department_id)txwheretx.l_type=3對于oracle進行簡單樹查詢(遞歸查詢)DEPTIDNUMBER部門idPAREDEPTIDNUMBER父部門id(所屬部門id)NAMECHAR(40Byte)部門名稱通過子節(jié)點向根節(jié)點追朔.select*frompersons
4、.deptstartwithdeptid=76connectbypriorparedeptid=deptid通過根節(jié)點遍歷子節(jié)點.select*frompersons.deptstartwithparedeptid=0connectbypriordeptid=paredeptid可通過level關(guān)鍵字查詢所在層次.selecta.*,levelfrompersons.deptastartwithparedeptid=0connectbypriordeptid=paredeptidPS:startwith后面所跟的就是就是遞歸的種子,也就是遞歸開始的地方;connectbyp
5、rior后面的字段順序是有講究的;若prior缺?。簞t只能查詢到符合條件的起始行,并不進行遞歸查詢;例:select*fromtablestartwithorg_id='HBHqfWGWPy'connectbypriororg_id=parent_id;簡單說來是將一個樹狀結(jié)構(gòu)存儲在一張表里,比如一個表中存在兩個字段:org_id,parent_id那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結(jié)構(gòu)。用上述語法的查詢可以取得這棵樹的所有記錄。其中:條件1是根結(jié)點的限定語句,當然可以放寬限定條件,以取得多個根結(jié)點,實際就是多棵樹。條件2是連接條件,其中用PRIO
6、R表示上一條記錄,比如CONNECTBYPRIORorg_id=parent_id就是說上一條記錄的org_id是本條記錄的parent_id,即本記錄的父親是上一條記錄。條件3是過濾條件,用于對返回的所有記錄進行過濾。簡單介紹如下:在掃描樹結(jié)構(gòu)表時,需要依此訪問樹結(jié)構(gòu)的每個節(jié)點,一個節(jié)點只能訪問一次,其訪問的步驟如下:第一步:從根節(jié)點開始;第二步:訪問該節(jié)點;第三步:判斷該節(jié)點有無未被訪問的子節(jié)點,若有,則轉(zhuǎn)向它最左側(cè)的未被訪問的子節(jié)點,并執(zhí)行第二步,否則執(zhí)行第四步;第四步:若該節(jié)點為根節(jié)點,則訪問完畢,否則執(zhí)行第五步;第五步:返回到該節(jié)點的父節(jié)點,并執(zhí)行第三步驟??傊?/p>
7、掃描整個樹結(jié)構(gòu)的過程也即是中序遍歷樹的過程。1.樹結(jié)構(gòu)的描述樹結(jié)構(gòu)的數(shù)據(jù)存放在表中,數(shù)據(jù)之間的層次關(guān)系即父子關(guān)系,通過表中的列與列間的關(guān)系來描述,如EMP表中的EMPNO和MGR。EMPNO表示該雇員的編號,MGR表示領(lǐng)導該雇員的人的編號,即子節(jié)點的MGR值等于父節(jié)點的EMPNO值。在表的每一行中都有一個表示父節(jié)點的MGR(除根節(jié)點外),通過每個節(jié)點的父節(jié)點,就可以確定整個樹結(jié)構(gòu)。在SELECT命令中使用CONNECTBY和STARTWITH子句可以查詢表中的樹型結(jié)構(gòu)關(guān)系。其命令格式如下:SELECT。。。CONN