oralce之遞歸算法

oracle遞歸算法的經典用途,比如 多級部門下,子部門不能作爲父部門的父部門。

有點拗口,比方說吧,爸爸部門下有甲兒子部門和乙兒子部門,甲或乙兒子部門不能成爲爸爸部門的上級部門。

這個是很多管理系統的多級分類下的經典需求。


好吧。給出部門表結構--Department。

Name       Type          Nullable Default Comments 
---------- ------------- -------- ------- -------- 
ID         NUMBER(12)              --ID                
DEPT_NO    VARCHAR2(32)  Y         --部門編號               
COMPANY_NO VARCHAR2(4)   Y         --區域             
NAME       VARCHAR2(128) Y         --名字                
PARENT_NO  VARCHAR2(32)  Y         --父部門編號   


判斷子部門是否能成爲爸爸部門的上級部門,採用到了遞歸。SQL:

SELECT COUNT(*) FROM (SELECT D.DEPT_NO,D.PARENT_NO FROM Department D
		CONNECT BY PRIOR D.DEPT_NO = D.PARENT_NO
		START WITH D.DEPT_NO = #deptNo# ) t  where t.DEPT_NO = #parentNo#

其中 CONNECT BY PRIOR  ....  START WITH.....   就是遞歸。   #deptNo# 、#parentNo# 分別代表 子部門 和 爸爸部門。


如果返回值等於1,則子部門不能成爲爸爸部門的上級部門;如果返回值不等於1,反之。


一年後,又有心得。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

例子,獲取子部門的上級,上級的上級,以此類推。如下圖


現在知道浙江財政,要查詢得到 浙江財政-》財政部-》國務院

sql如下:

SELECT D.NAME  FROM Department D CONNECT BY PRIOR  D.PARENT_NO = D.DEPT_NO 

如果要得到國務院下所有的子部門,

sql如下:

SELECT D.NAME  FROM Department D CONNECT BY PRIOR  D.DEPT_NO = D.PARENT_NO 

大家會發現,只是遞歸語句調換了一下,就會查詢不同的結果。








發佈了79 篇原創文章 · 獲贊 27 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章