Oracle自定义函数实现递归查询(用自定义函数替换connect_by_root)
创始人
2024-03-02 10:03:55

Oracle自定义函数实现递归查询(用自定义函数替换connect_by_root)

  • 1. 前言
  • 2. connect_by_root 和 自定义函数
    • 2.1 用 connect_by_root 实现
    • 2.2 用 自定义函数实现
      • 2.2.1 自定义函数
      • 2.2.2 实现效果

1. 前言

  • 看这篇文章之前可以先看下面的文章

    oracle递归查询(start with connect by prior)以及 树形统计connect_by_root(子节点汇总到父节点).

    数据来源和这篇文章里的一样,所有下面用到就直接给sql了,自己想复制数据的话,可以去上篇文章里拿

2. connect_by_root 和 自定义函数

  • 首先,先给一下表数据设计和想要的效果,不多说,直接给图
    在这里插入图片描述
    接下来就是用两种方式来实现,请继续……

2.1 用 connect_by_root 实现

  • 我这里就直接给个效果图了,sql我就不粘了,上篇文章里都有,剩下的都可以参考上篇文章里的3.3.2章节
    在这里插入图片描述

2.2 用 自定义函数实现

2.2.1 自定义函数

  • 此函数就是根据dept_id找到公司id,直接看函数:
    在这里插入图片描述
    在这里插入图片描述
  • 函数代码:
    create or replace function f_company_id(v_dept_id varchar2) return varchar2 iscompany_id varchar2(100);count_num        number;
    beginselect count(0) into count_num from sys_company_dept t where t.dept_id = v_dept_id and type = '1';if count_num = 1 thenreturn v_dept_id;elseselect f_company_id(t.parent_id) into company_id from sys_company_dept t where t.dept_id = v_dept_id and rownum < 2;return company_id;end if;
    end f_company_id;

2.2.2 实现效果

  • 调用上述函数,通过sql来实现想要的效果,如下
    在这里插入图片描述
  • sql 如下:
    with temp1 as(
    select t.*,f_company_id(t.dept_id) company_id
    from sys_company_dept t)
    select t1.*,t2.dept_name as company_name from temp1 t1
    left join sys_company_dept t2 on t1.company_id=t2.dept_id
    where t2.type='1';
    
  • 欧了,不用自带函数 connect_by_root ,也把问题解决

相关内容

热门资讯

我学会了忍耐作文 我学会了忍耐作文8篇  在日常学习、工作和生活中,说到作文,大家肯定都不陌生吧,根据写作命题的特点,...
我喜欢的动物作文 我喜欢的动物作文汇总6篇  在日常学习、工作抑或是生活中,许多人都写过作文吧,写作文可以锻炼我们的独...
初中作文读后感 初中作文读后感精选15篇  在平日的学习、工作和生活里,许多人都有过写作文的经历,对作文都不陌生吧,...
未来世界的作文 有关未来世界的作文8篇  在平凡的学习、工作、生活中,大家都有写作文的经历,对作文很是熟悉吧,写作文...
说说我的心里话作文500字 说说我的心里话作文500字(通用59篇)  在平平淡淡的学习、工作、生活中,大家都经常接触到作文吧,...