• Oracle实现递归查询


    前几天在开发的过程中遇到一个递归查询的问题,java代码大致是这样的:

          // 递归得到四级机构对象
    	public UserManagerDept getuserManagerDeptBy(String deptId)
    	{
    
    		UserManagerDept userManagerDept = null;
    		
    			userManagerDept = userManagerDeptService.getUserManagerDeptEntityBydeptId(deptId);
    			if (null == userManagerDept)
    			{
    				return null;
    			}
    				
    			if (!StringUtils.isNullOrEmpty(userManagerDept.getParentId()))
    			{
    				logger.info("***getParentId****" + userManagerDept.getParentId());
    				return getuserManagerDeptBy(userManagerDept.getParentId());
    				
    			} else
    			{
    				return userManagerDept;
    			}
    			
    		return null;
    
    	}
    

      逻辑是不是十分简单,但是一执行就死循环,并且一直循环到内存溢出,系统崩溃为止,有个同事一直在怀疑是不是内存太小了,但是我认为是不可能的,因为我们的运行服务器挺大的(2g), 实在找不到问题在哪,后来就换了种方式来实现递归, 那就是修改sql,将普通的sql查询语句,换成递归查询,下面上代码:

    select t.* from (
    select t.* from t_dept t start with t.dept_id = '1041001210001'
    connect by prior t.parent_id = t.dept_id) t
    where t.parent_id is null;
    

      注意代码中高亮显示的内容,通过.....start with ...connect by prior...来实现递归查询,是不是看不太懂,再详细一点好了,

    一,基本语法
    SELECT ... FROM
    (

    SELECT ... FROM    + 表名 
    START WITH         + 条件1
    CONNECT BY PRIOR   + 条件2

    )
    WHERE              + 条件3

    二,应用场景

        START WITH... CONNECT BY PRIOR...常见的用法,是用来遍历含有父子关系的表结构中。比如省市关系,一个省
    下面包含多个城市,如果城市基本信息表中,包含有属于哪个省级的字段,那么如果要遍历所有的城市,我们就可以
    使用START WITH... CONNECT BY PRIOR...。

    如果该内容对您有所帮助,请打赏----1毛就足够感动我

  • 相关阅读:
    C 找到该列最大的前两个数字
    C 寻找和最大的子序列
    C 找出最长的回文子串(不区分大小写)
    C 字符串数组
    C 寻找重复字符并输出他们的位置
    C 寻找0~100的守形数
    C 在外部函数中修改指针变量
    C int转为二进制 再进行与操作
    C 计算阶乘之和
    C 奇偶校验
  • 原文地址:https://www.cnblogs.com/yinyl/p/6656451.html
Copyright © 2020-2023  润新知