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 is company_id varchar2(100); count_num number; begin select count(0) into count_num from sys_company_dept t where t.dept_id = v_dept_id and type = '1'; if count_num = 1 then return v_dept_id; else select 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 ,也把问题解决