START WITH 定义数据行查询的初始起点;
CONNECT BY prior 定义表中的各个行是如何联系的;
connect by 后面的"prior" 如果缺省,则只能查询到符合条件的起始行,并不进行递归查询;
系统伪列:
CURRVAL AND NEXTVAL 使用序列号的保留字
ROWID 记录的唯一标识
ROWNUM 限制查询结果集的数量
LEVEL显示层次树中特定行的层次或级别
CONNECT_BY_ROOT 返回当前层的根节点(当前行数据所对应的最高等级节点的内容)
SYS_CONNECT_BY_PATH(column, char) 函数实现将从父节点到当前行内容以"path"或者层次元素列表的形式显示出来
CONNECT_BY_ISCYCLE 须带参数NOCYCLE,当前行中引用了某个父亲节点的内容并在树中出现了循环,如果循环显示"1",否则就显示"0".
CONNECT_BY_ISLEAF 判断当前行是不是叶子.如果是叶子显示"1",如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示"0"
而在 Oracle 10g 中,只要指定"NOCYCLE"就可以进行任意的查询操作.与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE, 如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示"1",否则就显示"0".
【实例】
--创建测试表,增加测试数据
insert into test values('0','1','A1');
insert into test values('1','11','A11');
insert into test values('11','111','A111');
commit;
--层次查询示例
from test
start with superid = '0' connect by prior id=superid;
--给出两个以前在"数据库字符串分组相加之四"中的例子来理解start with ... connect by ...
--功能:实现按照superid分组,把id用";"连接起来
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表
,1 + t.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 ENAME? ? ? JOB? ? ? ? MGR DEPTNO? THE_LEVEL PATH? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TOP_MANAGER
----- ---------- --------- ----- ------ ---------- -------------------------------------------------------------------------------- -----------
select * from tableName
start with ?条件A ? -- 开始递归的根节点,可多个条件
connect ?by 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;
select t.*,t.rowid from emp t
connect by prior t.empno = t.mgr ; --注意:connect by? t.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 : 保留树状结构,对兄弟节点进行排序
关键字:START WITH ... CONNECT BY PRIOR
select t.*,level from table_test t
connect by递归查询基本语法是:
connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制
prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示id就是这条记录的根节点了
举个例子,写条SQL:
oracle 递归查询start with connect by prior的用法和知识不仅仅这些,本博客只是简单记录一下我所遇到的,网上发现一篇写的比较详细的博客,在Linux公社, ,
oracle方面的一些知识也可以参考我之前的一篇博客:
以上就是土嘎嘎小编为大家整理的oracle怎么写递归相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!