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 

大家会发现,只是递归语句调换了一下,就会查询不同的结果。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值