oracle如何递归 oracle递归sql

Oracle递归查询start with connect by priorconnect by递归查询基本语法是:
start with:表示以什么为根节点,不加限制可以写1=1,要以id为123的节点为根节点 , 就写为start with id =123
connect by:connect by是必须的 , start with有些情况是可以省略的,或者直接start with 1=1不加限制
prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示id就是这条记录的根节点了
举个例子,写条SQL:
t_user(用户表),t_unit_info(单位表),意思是以单位编码为"15803"的单位为根节点 , 查找出其单位及其子单位的用户信息
然后将prior换一下位置 , 发现只能查出单位编码为"15803"对应的单位 , 不能查子级单位
oracle 递归查询start with connect by prior的用法和知识不仅仅这些 , 本博客只是简单记录一下我所遇到的,网上发现一篇写的比较详细的博客 , 在Linux公社,,
【oracle如何递归 oracle递归sql】oracle方面的一些知识也可以参考我之前的一篇博客:
Oracle递归查询:使用prior实现树操作select * from tableName
start with条件A-- 开始递归的根节点,可多个条件
connectby prior条件B-- prior决定查询的索引顺序
where 条件 C
select t.empno,t.mgr,t.deptno ,level
from emp t
connect by prior t.empno=t.mgr
order by level,t.mgr,t.deptno;
找到empno为7369的所有领导 。
select t.*,t.rowid from emp t
start with t.empno = 7369--从empno为7369的开始查找
connect by prior t.mgr = t.empno ;--上一条数据(这里就是empno为7369)的mgr == 当前遍历这一条数据的empno(那么就会找到empno为7902的用户)
找到empno为7566的所有下属
select t.*,t.rowid from emp t
start with t.empno = 7566
connect by prior t.empno = t.mgr ;--注意:connect byt.mgr =prior t.empno与左边写法含义一样
start with:设置起点,省略后默认以全部行为起点 。
connect by [condition]:与一般的条件一样作用于当前列,但是在满足条件后,会以全部列作为下一层级递归(没有其他条件的话) 。
prior: 表示上一层级的标识符 。经常用来对下一层级的数据进行限制 。不可以接伪列 。
level:伪列 , 表示当前深度 。
connect_by_root():显示根节点列 。经常用来分组 。
connect_by_isleaf:1是叶子节点,0不是叶子节点 。在制作树状表格时必用关键字 。
sys_connect_by_path():将递归过程中的列进行拼接 。
nocycle , connect_by_iscycle: 在有循环结构的查询中使用 。
siblings: 保留树状结构,对兄弟节点进行排序
;request_id=162538763316780265474850biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-22-52652111.first_rank_v2_pc_rank_v29_1utm_term=ORACLE递归函数spm=1018.2226.3001.4187
;request_id=162538763316780269872688biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-5-108683534.first_rank_v2_pc_rank_v29_1utm_term=ORACLE递归函数spm=1018.2226.3001.4187
;request_id=162538763316780265474850biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-10-105773226.first_rank_v2_pc_rank_v29_1utm_term=ORACLE递归函数spm=1018.2226.3001.4187
oracle 存储过程 递归实现 依赖分析下面是用oracle数据库解决不用start with 来查询子父数据查询方法,里面主要用到了substr 和instr 函数(这两个函数,其他数据库也有相对应的函数),游标(其他数据库也有游标) 。
-- 1 前提:创建表以及插入数据
CREATE TABLE TMP_TEST(MAIN_COLUMN VARCHAR2(10),PARENT_COLUMN VARCHAR2(10));
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('A',NULL);
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('B','A');
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('C','A');
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('D','A');
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('E','B');
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('F','C');
INSERT INTO TMP_TEST(MAIN_COLUMN,PARENT_COLUMN) VALUES('G','E');
-- 2 创建存储过程
CREATE OR REPLACE PROCEDURE GET_TREE(IS_PARENTIN NUMBER /** 子父查询 **/,
SEARCH_IDIN VARCHAR2 /** 查询条件节点 **/,
TREE_RESOUT OUT VARCHAR2 /** 输出结果集合 **/)
AS
V_TEMP VARCHAR2(4000);
V_SEARCH VARCHAR2(4000);
V_INDEX INTEGER;
BEGIN
V_TEMP :=SEARCH_ID||'-';
TREE_RESOUT := '';
WHILE length(V_TEMP)0 LOOP
V_INDEX := instr(V_TEMP,'-');
V_SEARCH := substr(V_TEMP,0,V_INDEX-1);
V_TEMP := substr(V_TEMP,V_INDEX 1);
/*DBMS_OUTPUT.put_line('V_INDEX:'|| V_INDEX ||'V_TEMP:' ||V_TEMP||'V_SEARCH:'|| V_SEARCH);*/
/** 查询子节点 **/
if(IS_PARENT = 1) THEN
FOR C1 IN (SELECT * FROM TMP_TEST T1 WHERE T1.PARENT_COLUMN = V_SEARCH) LOOP
TREE_RESOUT := TREE_RESOUT || C1.MAIN_COLUMN;
V_TEMP := V_TEMP || C1.MAIN_COLUMN || '-';
END LOOP;
ELSE
/** 查询父节点 **/
FOR C1 IN (SELECT * FROM TMP_TEST T1 WHERE T1.MAIN_COLUMN = V_SEARCH) LOOP
TREE_RESOUT := TREE_RESOUT || C1.PARENT_COLUMN;
V_TEMP := V_TEMP || C1.PARENT_COLUMN || '-';
END LOOP;
END IF;
END LOOP;
/*DBMS_OUTPUT.put_line('TREE_RESOUT:'||TREE_RESOUT);*/
END;
-- 3 调用存储过程
declare
TREE_RESULT VARCHAR2(4000);
SEARCH_ID VARCHAR2(4000);
begin
get_tree(1,'A',TREE_RESULT);
dbms_output.put_line('查询子节点:' || TREE_RESULT);
get_tree(0,'G',TREE_RESULT);
dbms_output.put_line('查询父节点:' || TREE_RESULT);
end;
ORACLE递归about connect by
SELECT empno, ename, job, mgr, deptno, LEVEL, sys_connect_by_path(ename,'\'), connect_by_root(ename) FROM emp START WITH mgr IS NULL CONNECT BY mgr =PRIOR empno
WITH T(empno, ename, job, mgr, deptno, the_level, path,top_manager) AS ( ---- 必须把结构写出来
SELECT empno, ename, job, mgr, deptno---- 先写锚点查询,用START WITH的条件
,1 AS the_level---- 递归起点,第一层
,'\'||ename---- 路径的第一截
,ename AS top_manager ---- 原来的CONNECT_BY_ROOT
FROM scott.EMP
WHERE mgr IS NULL ---- 原来的START WITH条件
UNION ALL---- 下面是递归部分
SELECT e.empno, e.ename, e.job, e.mgr, e.deptno---- 要加入的新一层数据 , 来自要遍历的emp表
,1t.the_level---- 递归层次,在原来的基础上加1 。这相当于CONNECT BY查询中的LEVEL伪列
,t.path||'\'||e.ename---- 把新的一截路径拼上去
,t.top_manager---- 直接继承原来的数据,因为每个路径的根节点只有一个
FROM t, scott.emp e---- 典型写法,把子查询本身和要遍历的表作一个连接
WHERE t.empno = e.mgr---- 原来的CONNECT BY条件
) ---- WITH定义结束
SELECT * FROM T
EMPNO ENAMEJOBMGR DEPTNOTHE_LEVEL PATHTOP_MANAGER
----- ---------- --------- ----- ------ ---------- -------------------------------------------------------------------------------- -----------
7839 KINGPRESIDENT101 \KINGKING
7566 JONESMANAGER7839202 \KING\JONESKING
7698 BLAKEMANAGER7839302 \KING\BLAKEKING
7782 CLARKMANAGER7839102 \KING\CLARKKING
7999 MIKEANALYST7566303 \KING\JONES\MIKEKING
7499 ALLENSALESMAN7698303 \KING\BLAKE\ALLENKING
7521 WARDSALESMAN7698303 \KING\BLAKE\WARDKING
7654 MARTINSALESMAN7698303 \KING\BLAKE\MARTINKING
7788 SCOTTANALYST7566203 \KING\JONES\SCOTTKING
7844 TURNERSALESMAN7698303 \KING\BLAKE\TURNERKING
7900 JAMESCLERK7698303 \KING\BLAKE\JAMESKING
7902 FORDANALYST7566203 \KING\JONES\FORDKING
7934 MILLERCLERK7782103 \KING\CLARK\MILLERKING
7369 SMITHCLERK7902204 \KING\JONES\FORD\SMITHKING
7876 ADAMSCLERK7788204 \KING\JONES\SCOTT\ADAMSKING
关于oracle如何递归和oracle递归sql的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读