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
大家会发现,只是递归语句调换了一下,就会查询不同的结果。