一,基本语法

SELECT ... FROM    + 表名 
[START WITH         + 条件1]
CONNECT BY PRIOR   + 条件2
WHERE              + 条件3

条件1:是根节点的限定语句,当然可以放宽限定条件,以取得多个根节点,也就是多棵树;在连接关系中,除了可以使用列明外,还允许使用列表达式。
START WITH 子句为可选项,用来标识哪个节点作为查找树形结构的根节点若该子句省略,则表示所有满足查询条件的行作为根节点。
条件2:是连接条件,其中用PRIOR表示上一条记录,例如CONNECT BY PRIOR STUDENT_ID = GRADE_ID,意思就是上一条记录的STUDENT_ID是本条记录的GRADE_ID,即本记录的父亲是上一条记录。CONNECT BY子句说明每行数据将是按照层次顺序检索,并规定将表中的数据连入树形结构的关系中。
PRIOR运算符必须放置在连接关系的2列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构的顺序是自顶向下,还是自底向上。
条件3:是过滤条件,用于对返回的记录进行过滤。

1,定义查找起始节点
    在自顶向下查询树状结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始,向下查找。这样查找的结果就是以该节点为开始
的结构是树的一枝。

看一个例子:
SELECT * FROM STUDENT 
START WITH STUDENT_ID = '00001'
CONNECT BY PRIOR STUDENT_ID = GRADE_ID;

1,CONNECT BY PRIOR是结构化查询中用到的;
2,START WITH... CONNECT BY PRIOR...的作用,简单来说,就是将一个树状结构存储在一张表里。

假如一个表里存在2个字段:STUDENT_ID(学生ID)、GRADE_ID(班级ID),那么我们可以通过表示每一个学生属于哪一个班级,来形成一个树状结构,通过START WITH... CONNECT BY PRIOR...语法,就可以取得这棵树的所有记录。

--自顶向下 以BRH_ID = '0003'这个节点为根节点,向下查询
SELECT * FROM IM_BRANCH 
START WITH BRH_ID = '0003'
CONNECT BY PRIOR BRH_ID = BRH_PARENTID

--自底向上 以BRH_ID = '0003'这个节点为叶节点,向上查询
SELECT * FROM IM_BRANCH 
START WITH BRH_ID = '0003'
CONNECT BY BRH_ID = PRIOR BRH_PARENTID

二,应用场景

START WITH... CONNECT BY PRIOR...常见的用法,是用来遍历含有父子关系的表结构中。比如省市关系,一个省
下面包含多个城市,如果城市基本信息表中,包含有属于哪个省级的字段,那么如果要遍历所有的城市,我们就可以

使用START WITH... CONNECT BY PRIOR...。

oracle 提供了start with connect by 语法结构可以实现递归查询。

1. 一个简单举例:

SQL> select *  from test;

BILL_MONTH           DAY_NUMBER          MSISDN

--------------------          ----------                      --------------------

200803                        1                                 13800

200803                        3                                 13800

200803                        2                                 13800

200803                        2                                 13801

200803                        4                                 13804

200803                        5                                 13804

200803                        7                                 13804

200803                        8                                 13804

200803                        6                                 13802

200803                        6                                 13801

200803                        7                                 13801

200803                        8                                 13801

12 rows selected

SQL>

SQL> select * from test

2       start with day_number=1

3       connect by  prior day_number=day_number-1 and prior msisdn= msisdn;

BILL_MONTH           DAY_NUMBER         MSISDN

--------------------          ----------                     --------------------

200803                        1                              13800

200803                        2                              13800

200803                        3                              13800

上面的语句查找出了从1开始,并且day_number 逐渐+1 递增的,并且 msisdn 相同的哪些个数据.

2. start with  connect by 语法结构

如上面说看到的 例子, 其语法结构为  start with condition  connect by  condition (含 prior 关键字)

start with conditon 给出的seed 数据的范围, connect by  后面给出了递归查询的条件,prior 关键字表示父数据,prior 条件表示子数据需要满足父数据的什么条件。

在下面的这个start with connect by 结构中,就表示 查找出了从1开始,父数据的day_number等于子数据的day_number-1而且父数据的msisdn=子数据的msisdn.

start with day_number=1

connect by  prior day_number=day_number-1 and prior msisdn= msisdn

oracle中的start with相关推荐

  1. oracle 存储过程 状态,查看ORACLE中正在运行的存储过程 | 学步园

    1.如何查看ORACLE中正在运行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks ...

  2. oracle自增列问题i,关于oracle中自增列问题

    昨天去面试,面试官文oracle中有没有自增列,平时没留意,今天查了一下资料,做了个例子. oracle中没有自增列,可以设定, 但手写方法.序列或触发器都可以实现,下面是我实现的一种方法 ----- ...

  3. C# 实现Oracle中的数据与Excel之间的转换

    最近项目要求实现数据库之间数据在各个数据库之间导入导出,在此做个笔记 1. 将Oracle中的表导入到Excel中,反之亦然 private static readonly string connec ...

  4. Oracle中Hint深入理解(原创)

    http://czmmiao.iteye.com/blog/1478465 Hint概述  基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明 ...

  5. mysql nextval同步锁_mysql中实现类似oracle中的nextval函数

    我们知道mysql中是不支持sequence的,一般是建表的时间使这个字段自增. 如       create table table_name(id int auto_increment prima ...

  6. 从oracle中读取图片,Pb从oracle中读取和保存图片

    Pb从oracle中读取和保存图片 (2008-12-12 12:23:20) 转载 分类:编程 标签: it //保存图片 //选择文件 string pname, fname integer va ...

  7. Oracle中merge into的使用

    http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...

  8. oracle中创建触发器

    从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...

  9. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  10. 理解oracle中连接和会话

    理解oracle中连接和会话 1.  概念不同:概念不同: 连接是指物理的网络连接. 在已建立的连接上,建立客户端与oracle的会话,以后客户端与oracle的交互都在一个会话环境中进行. 2.   ...

最新文章

  1. android 修改编译内核源码 对抗反调试
  2. php xml expat,PHP Expat :XML的解析器
  3. html5 元素重叠,javascript – 检查两个或多个DOM元素是否重叠
  4. 在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?
  5. 解读年度数据库性能:PostgreSQL的日志文件和数据加载
  6. 从病毒到“基础软件污染”,Linux 真的安全吗?
  7. [Java] 蓝桥杯ALGO-43 算法训练 A+B Problem
  8. 韩忠康 5天玩转mysql_玩转MySQL数据库5天就够了(2)
  9. 解决PID 4、NT Kernal占用80、445等端口
  10. 【STM32】Keil v5下载与安装
  11. 关于echar彩色柱状图颜色配置问题
  12. andriod 无网络逻辑设置和判断
  13. 我说CMMI2.0之产品集成
  14. 字节跳动为什么选用 Flutter : 可能成为不一样的未来 | 开发者说·DTalk
  15. MySQL 安装时出现初始化数据失败的解决方案
  16. 领域分类的问题_别人的问题领域
  17. C# 保存窗口为图片(保存纵断面图)
  18. vim: command not found 绝妙解决方案
  19. bootstra查阅参考文档
  20. rosetta2安装_您需要了解有关Apple Silicon Macs上的Rosetta 2的所有信息

热门文章

  1. c语言由天数求日期,C语言-由日期求天数由天数求日期
  2. ArcMap打不开.jpg .bmp
  3. macOS中修改hosts文件
  4. html设置图片为部分背景颜色,设置HTML的一个部分作为一个不同的背景颜色
  5. Android 自定义搜索框(带搜索图标、清除图标、语音图标)
  6. 软考中级嵌入式系统设计师备考攻略
  7. idea pull从远程库拉取最新代码
  8. 三维数字沙盘电子沙盘MR AR VR虚拟现实无人机倾斜摄影三维全景建模卫星图片矢量
  9. 内存的读写速度是硬盘的多少倍
  10. <blockquote>标签 自定义样式