Oracle 递归函数

1、自连接

--需求-1:
--员工编号、员工姓名、上级领导编号、上级领导姓名、自连接
SELECT e.empno, m.ename
FROM emp e, emp m
WHERE e.mgr=m.empno;

 

 

 2、递归

1)求出员工编号为7369的所有上级领导

--需求-2:
--求出员工编号为7369的所有上级领导
SELECT empno, ename
FROM emp e
START WITH empno=7369
CONNECT BY empno=PRIOR mgr;

 

 

 2)求出员工编号为7369的所有下属

--需求-3:
--求出员工编号为7369的所有下属
SELECT empno, ename
FROM emp e
START WITH empno=7369
CONNECT BY PRIOR empno= mgr;

 

 

 3)求出各个员工的所有上级领导

复制代码
--需求-4:
--求出各个员工所有级领导
SELECT a1.*, (
  SELECT SUBSTR(SYS_CONNECT_BY_PATH(empno, '->'), 3) NAME_PATH
  FROM emp a
  WHERE a.mgr IS NULL
  START WITH a.empno = a1.empno
  CONNECT BY PRIOR a.mgr = a.empno
) AS NAME_PATH
FROM emp a1;
复制代码

 

 

 4)取编号为104001008002城市的所有上级城市 南关区

复制代码
--需求5:
--取编号为104001008002城市的所有上级城市 南关区
SELECT * FROM china
WHERE c_id = 104001008002;
------LEVEL可以对得到的所有上级/下级进行排序,可以表示出层级大小
------SYS_CONNECT_BY_PATH()可以用指定的分隔符对各层级进行分隔
SELECT c_id, c_name, LEVEL,
       SYS_CONNECT_BY_PATH(c_name, '->')
FROM china
START WITH c_id = 104001008002
CONNECT BY c_id = PRIOR superior_c_id;
复制代码

 

 5)查询中南地区各下级城市列表

复制代码
--需求6:
--查询中南地区各下级城市列表
SELECT 中南地区下级城市列表,
       REGEXP_SUBSTR(中南地区下级城市列表, '[^->]+', 1, 1)地区,
       REGEXP_SUBSTR(中南地区下级城市列表, '[^->]+', 1, 2)省份,
       REGEXP_SUBSTR(中南地区下级城市列表, '[^->]+', 1, 3)城市,
       REGEXP_SUBSTR(中南地区下级城市列表, '[^->]+', 1, 4)区县
FROM(
SELECT c_id, c_name, LEVEL le, 
       SYS_CONNECT_BY_PATH(c_name, '->') as 中南地区下级城市列表
FROM china
START WITH c_id = 104
CONNECT BY PRIOR c_id = superior_c_id
)
where le=4;
复制代码

 

posted @ 2022-12-19 00:00  yclizq  阅读(378)  评论(0编辑  收藏  举报