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

  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楼的函数。

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;没有返回1
SYS_CONNECT_BY_PATH:函数显示详细路径,并用“/”分隔.其中这个分隔符可以替换。

作者 : li0924

时间 : 2014-11-20

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

时间: 2024-10-11 11:03:34

oracle高级SQL(三)--递归查询的相关文章

oracle高级SQL(四)--SQL行列转换专题2

[上一专题]  行列转换1  -- PIVOT与UNPIVOT函数的介绍 实现案例 1001 lufei 1001 shanzhi 1001 namei 1001 qiaoba 实现效果如下: 1001 lufei,shanzhi,namei,qiaoba 典型的行列转换:实现这种方法有很多. 其中oracle11g之后提供了listagg函数;用来实现上面的效果最好不过了:我们来看下listagg语法 listagg函数的语法结构如下: >listagg( [,]) within group

oracle常用高级sql操作

一.运算符 算术运算符:+ - * / 可以在select 语句中使用 连接运算符:||    select deptno|| dname from dept; 比较运算符:> >= = != < <= like between is null in 逻辑运算符:not and or 集合运算符: intersect ,union, union all, minus 要求:对应集合的列数和数据类型相同 查询中不能包含long 列 列的标签是第一个集合的标签 使用order by时,

oracle学习 第三章 常用的SQL*PLUS命令 ——02

今天接着昨天的RUN命令继续讲. 3.5 n(设置当前行)命令和A(PPEND)(附加)命令 设想,你输入了例3-10的查询语句 例 3-10 SQL> SELECT ename 2 FROM emp; 例 3-10 结果 看到以上输出时,您发现在SELECT子句中忘了job,sal.这时您又如何修改您的SELECT子句呢?首先您应该使用SQL*PLUS的L(LIST)命令来显示SQL缓冲中的内容. 例 3-11 SQL> L 例 3-11 结果 在例3-11显示的结果中,2后面的"

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH

Oracle PL/SQL 高级编程

1. 复合数据类型--记录类型 ?        语法格式 type  类型名 is   record ( 字段1  字段1类型 [not null]:=表达式1; 字段2  字段2类型 [not null] :=表达式2; - ) ?        说明:记录之间相互赋值要求两个记录类型完全相同. ?        案例 举例1 --创建表并插入记录 create table student(idnumber, name varchar2(20), birthday date); insert

oracle学习 第三章 常用的SQL*PLUS命令 ——01

下面我们开始新的一章学习! 当输入SQL语句时,该语句被存在SQL缓冲区中(即一个内存区).这个SQL缓冲区很小,只能存一个SQL语句,当下一条SQL语句输入时,原来在缓冲区中的SQL语句被覆盖掉.SQL*PLUS是一个工具(环境).正像我们所看到的,我们可以用它来输入SQL语句.为了有效的输入和编辑SQL语句,SQL*PLUS还提供了一些常用的命令.与SQL语句不同的是SQL*PLUS的命令是可以缩写的.下面就简单的介绍一些常用的SQL*PLUS命令. 3.1 DESC[RIBE]命令 一般在

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]

oracle 高级分组

oracle 高级分组 博客分类: 数据库基础 oraclesql Java代码   10.高级分组 本章目标: 对于增强的group by需要掌握: 1.使用rollup(也就是roll up累计的意思)操作产生subtotal(小计)的值. 2.使用cube操作产生cross-tabulation(列联交叉表)的值. 3.使用grouping函数标识通过rollup和cube建立的行的值. 4.使用grouping sets产生一个single result set(结果集). 5.使用gr

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------