首页 > 代码库 > oracle高级SQL(三)--递归查询
oracle高级SQL(三)--递归查询
oracle中有connect by子句。是用于层次查询。就是递归查询。
其中语法如下:
SELECT ... FROM <TABLENAME>WHERE <CONDITIONAL-1>START WITH <CONDITIONAL-2>CONNECT BY <CONDITIONAL-3>
注解:
1. CONDITIONAL-1条件:即SQL中的过滤条件,
2.CONDITIONAL-2条件:是根结点的限定语句;是从哪个条件开始。
3. CONDITIONAL-3条件:是连接条件;即按照什么条件去递归查询
注意其中两个关键字PRIOR;LEVEL
- prior:运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:empno为员工号;mgr为领导编号
CONNECT BY PRIOR EMPNO=MGR
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
CONNECT BY EMPNO=PRIOR MGR - level:是这个树形结果的深度,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2
至于它们的作用;我们用下面一个例句来理解
SQL> select * from li0924; ROOT_ID ID NAME---------- ---------- ---------- 0 1 namei --最近在看海贼王;借用下名字 1 2 lufei 1 3 shanzhi 0 4 qiaoba 3 5 suolong 4 6 luobin6 rows selected.SQL> SELECT root_id,PRIOR ID,ID,NAME,LEVEL FROM i0924 2 START WITH root_id = 0 3 CONNECT BY root_id = PRIOR ID; --注意root_id和prior id这两列。其中level可以看作是深度 ROOT_ID PRIORID ID NAME LEVEL---------- ---------- ---------- ---------- ---------- 0 1 namei 1 1 1 2 lufei 2 1 1 3 shanzhi 2 3 3 5 suolong 3 0 4 qiaoba 1 4 4 6 luobin 26 rows selected.
作用:
【1】生成序列
产生一个1-10列表。
类似liunx命令中seq 10。当然像postgresql数据库,其中用序列函数。generate_series(1, 10)。oracle中是没有这个函数的。但是我们可以借用connect by子句。
SQL> SELECT LEVEL FROM dual CONNECT BY LEVEL <= 10; LEVEL---------- 1 2 3 4 5 6 7 8 9 1010 rows selected.
【2】分割字符串
先看这一例,26楼的函数。
http://www.itpub.net/thread-1895923-3-4.html
分割字符串;这部分内容我想等到下一章节再说;
【3】oracle的进制转换
我的博客3篇 --36,16,8进制转换为10进制的函数。
【4】主要函数
其实就是我们常用的;借用上面那个表。
SELECT CONNECT_BY_ROOT NAME "ROOT" , 2 CONNECT_BY_ISLEAF "ISLEAF", 3 SYS_CONNECT_BY_PATH(NAME, ‘/‘) AS PATH 4 FROM li0924 5 START WITH root_id = 0 6 CONNECT BY root_id = PRIOR ID;ROOT ISLEAF PATH --------------------------------------------------------------------------------namei 0 /namei namei 1 /namei/lufei namei 0 /namei/shanzhi namei 1 /namei/shanzhi/suolong qiaoba 0 /qiaoba qiaoba 1 /qiaoba/luobin 6 rows selected.
说说这CONNECT_BY_ROOT,CONNECT_BY_ISLEAF,SYS_CONNECT_BY_PATH,这三个函数的意义
CONNECT_BY_ROOT: 返回当前节点的最顶端节点 CONNECT_BY_ISLEAF: 判断是否为叶子节点,如果有则返回0;没有返回1SYS_CONNECT_BY_PATH:函数显示详细路径,并用“/”分隔.其中这个分隔符可以替换。
作者 : li0924
时间 : 2014-11-20
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
oracle高级SQL(三)--递归查询
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。