查询基本结构:

select … from table_name
       start with 条件1
       connect by 条件2

1、建测试用表

  1. create table test_prior(
  2. ids number,
  3. son varchar2(200),
  4. father varchar2(200)
  5. );

并插入数据

start with指定树的根(即父节点)实际上你还可以指定多个根的,比如 father in ('爷爷', '爸爸')
而connect by prior son = father相当于表名在递归的过程中,查找到的树中其它节点接着又作为根结点。然后继续递归(prior在的一侧表示该侧为子节点)
为了便于理解可以可以connect by prior那一行当作多余的,只记住要查询的列名放前面,根列名放等号后面就行,这样只要指定树的根结点就比较好理解了。

  1. select son
  2. from test_prior
  3. start with father = '爷爷'
  4. connect by prior son = father;
  5.  
  6. select distinct son
  7. from test_prior
  8. start with father in( '爷爷' , '爸爸' )--指定多个根会出现重复的数据
  9. connect by prior son = father;

2、START WITH 可以省略,比如

  1. select son from test_prior connect by prior son = father;

此时不指定树的根的话,就默认把test_prior整个表中的数据从头到尾遍历一次,每一个数据做一次根,然后遍历树中其他节点信息.
在这个例子中,上面的SQL等价如下:

  1. select son
  2. from test_prior
  3. start with father in ('爷爷', '爸爸', '儿子', '孙子A', '孙子B', '孙子C')
  4. connect by prior son = father;

那查询到的结果如下,有很多重复信息的

3、nocycle关键字
我们知道标准的树结构中是不会有环的,但表中的树形结构不是标准的,有可能导致环的出现,当然在Oracle中的role是禁止出现循环的.比如你grant A to B ,grant B to C 。再来个grant C to A会出错的
假如有个上面的环,在再使用开始的递归查询语言会出错.得用nocycle关键字指定忽略环。

  1. select son
  2. from test_prior
  3. start with father = '爷爷'
  4. connect by nocycle prior son = father;

其他特性:
1、level关键字,代表树形结构中的层级编号;第一层是数字1,第二层数字2,依次递增。
2、CONNECT_BY_ROOT方法,能够获取第一层集结点结果集中的任意字段的值;例CONNECT_BY_ROOT(字段名)。

  1. select t.*,level,son,father,connect_by_root(son)
  2. from test_prior t
  3. start with father = '爷爷'
  4. connect by prior son = father

  1. select t.*,level,son,father,connect_by_root(father)
  2. from test_prior t
  3. start with father = '爷爷'
  4. connect by prior son = father

3、实现1到10的序列。

使用rownum或level实现1到10的序列

  1. select rownum from dual connect by rownum<=10;
  2. select level from dual connect by level<=10;

例:查询当前时间往前的12周的开始时间、结束时间、第多少周

  1. select sysdate - (to_number(to_char(sysdate - 1, 'd')) - 1) -
  2. (rownum - 1) * 7 as startDate,
  3. sysdate + (7 - to_number(to_char(sysdate - 1, 'd'))) -
  4. (rownum - 1) * 7 as endDate,
  5. to_number(to_char(sysdate, 'iw')) - rownum + 1 as weekIndex
  6. from dual
  7. connect by level<= 12;--将level改成rownum可以实现同样的效果

(注:此为学习记录笔记,仅供参考若有问题请指正,后续补充......)

参考原文:https://blog.csdn.net/wang_yunj/article/details/51040029

参考原文:https://blog.csdn.net/weiwenhp/article/details/8218091

Oracle递归查询(start with…connect by prior)的更多相关文章

  1. Oracle递归查询start with connect by prior

    一.基本语法 connect by递归查询基本语法是: select 1 from 表格 start with ... connect by prior id = pId start with:表示以 ...

  2. oracle的start with connect by prior

    oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况: 第一种:start with 子节点ID='...' connec ...

  3. oracle的start with connect by prior如何使用

    oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况: 第一种:start with 子节点ID='...' connec ...

  4. Oracle高级函数篇之递归查询start with connect by prior简单用法

    路飞:" 把原来CSDN的博客转移到博客园咯!" 前段时间,自己负责的任务中刚好涉及到了组织关系的业务需求,自己用了oracle递归查询.下面简单来举个例子.在工作中我们经常会遇到 ...

  5. Oracel递归查询start with ...connect by prior在Mysql中的实现

    Oracle是一个强大的数据库,有很多的函数和语法可以带来很多便利,有些函数和语法在Mysql中有代替的,但是有些没有现成可用的方法,比如Oracle的递归,在Mysql中怎么实现呢? 例子: Ora ...

  6. oracle中 start with .. connect by prior.. 用法简介

    我们经常会将一个比较复杂的目录树存储到一个表中.或者将一些部门存储到一个表中,而这些部门互相有隶属关系.这个时候你就会用到connect by prior start with.oracle 提供了s ...

  7. Oracle:Start with connect by prior 递归

    SELECT * from CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR列名2} [START WITH]; Oracle的递归查询:     START WITH :描述开始 ...

  8. Oracle中start with...connect by (prior)子句的用法

    connect by 是结构化查询中用到的,基本语法是:select … from tablenamestart with 条件1connect by 条件2where 条件3; 例:select * ...

  9. oracle 中的select ...connect by prior ...start with 及(+)的用法

    1.select ...connect by prior ...start with的用法: select ... from <tablename> where <condition ...

  10. oracle的START WITH CONNECT BY PRIOR用法

    转自:https://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html Oracle 树操作(select…start with…con ...

随机推荐

  1. Spring Boot☞ 统一异常处理

    效果区:  代码区: package com.wls.integrateplugs.exception.dto; public class ErrorInfo<T> { public st ...

  2. 【转载】MYSQL模式匹配:REGEXP和like用法

    转载地址:http://www.webjx.com/database/mysql-32809.html like like要求整个数据都要匹配,而REGEXP只需要部分匹配即可. 也就是说,用Like ...

  3. java.lang.NoClassDefFoundError: Could not initialize class com解决方案

    编写的时候遇到这样一个bug, java.lang.NoClassDefFoundError: Could not initialize class com 纠结了两天多,但是,没有找到答案,这个问题 ...

  4. win32 zbar

    一.zbar官方介绍 ZBar 是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图片扫描,支持多平台,例如 iPhone,Andriod 手机,同时 ZBar封装了二维码扫描的 API 开发包. Z ...

  5. Fiddler手机https抓包

    Fiddler手机抓包:https://blog.csdn.net/wangjun5159/article/details/52202059 fiddler 使用说明:https://www.cnbl ...

  6. [LeetCode 题解]: palindromes

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  7. 基于 ZKEACMS 的云建站 / 自助建站解决方案

    基于ZKEACMS的云建站 / 自助建站解决方案,一站式托管,解决企业建站需求,功能强大,高度自定义.用户只需在界面上输入一些基本信息,选择相应的主题 / 网站模板,然后就可以快速创建一个独一无二的网 ...

  8. django drf viewsets和routers

    1.定义VIew from django.shortcuts import render from rest_framework.views import APIView from rest_fram ...

  9. Linux基本命令集合

    #Linux查看版本当前操作系统内核信息 uname -a #Linux查看当前操作系统版本信息 cat /proc/version #Linux查看版本当前操作系统发行版信息 cat /etc/is ...

  10. Android下拉刷新完全解析

    http://blog.csdn.net/guolin_blog/article/details/9255575 http://www.cnblogs.com/loonggg/p/3201505.ht ...