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
大家會發現,只是遞歸語句調換了一下,就會查詢不同的結果。