码迷,mamicode.com
首页 > 数据库 > 详细

oracle高级SQL(三)--递归查询

时间:2014-11-20 19:59:22      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   os   sp   数据   on   

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
  1. prior:运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
    PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:empno为员工号;mgr为领导编号
    CONNECT BY PRIOR EMPNO=MGR
    PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
    CONNECT BY EMPNO=PRIOR MGR
  2. 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 luobin

6 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              2

6 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
        10

10 rows selected.

 【2】分割字符串

     先看这一例,26楼的函数。
     分割字符串;这部分内容我想等到下一章节再说;
【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;没有返回1
SYS_CONNECT_BY_PATH:函数显示详细路径,并用“/”分隔.其中这个分隔符可以替换。

 

作者 : li0924

时间 : 2014-11-20

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

 

oracle高级SQL(三)--递归查询

标签:style   blog   http   io   ar   os   sp   数据   on   

原文地址:http://www.cnblogs.com/lottu/p/4111236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!