Oracle为数据处理人员提供了强大的处理性能的同时,也提功了很多成熟的特殊需求解决方案,start with就是Oracle提供的层级数据求解关系的解决方案,下面我将用一个实际开发案例为大家介绍其用法

如当前拥有数据表te(组织机构表),表内存在zzbm(组织编码)、sjzzbm(上级组织编码)字段,数据中存在部门级组织机构、单位级组织结构两种数据,并提供zzlx(组织类型)这一字段区分数据所属种类,该字段值1标识单位,2标识部门

如上条件下,现有一需求为:求出该表中所有部门数据所属的末级单位的组织编码,数据样例如下

该需求正确结果如下—mjdw(末级单位)

从结果中,可以分析得到一下几点
1、单位级数据无需求该字段值
2、单位之间也存在层级关系
3、末级单位不能受单位之间层级关系的影响


知道需求之后我们来了解一下Oracle的start with算法,内部核心是什么,见下图

start with算法内部的核心是树算法,或者叫森林算法更贴切一点,它以树顶点与树的叶子节点的方式求出层级关系,如图中圆代表单位数据,三角代表部门数据,算法的使用就是一个选定谁为顶点,以及其他树叶子节点以什么条件关联顶点的过程,但是该算法有一个注意点,既如果顶点之间也满足可以关联到的条件,就是说一个树顶点本身又是其他顶点的子节点,那么就会影响子节点的层级数据,如图中数据最终会存在如下的数据

因此我们在使用的时候要注意这一情况,避免对结果产生影响

在使用的时候,start with用来确定顶点,connect by用来确定顶点与子节点之间的关系,PRIOR关键字用来在关系中确定关系中的父节点


言归正传,我们开始解决需求,解决思路如下
1、先确定出所有的树,同时计算树中各个子节点到顶点的层级
2、筛选出所有部门级别的层级数据
3、使用排序开窗函数,区分同一子节点与不同顶点的层级次序
4、对第三步结果中的层次次序取最小层级数据,既是需要的末级单位

整体sql如下

with te1 as (--第一层,先确定出所有的树,同时计算树中各个子节点到顶点的层级,CONNECT_BY_ROOT用来查询当前节点的顶点是谁SELECTzzbm,sjzzbm,zzlx,CONNECT_BY_ROOT(zzbm) rt,LEVEL lv  FROM te start with te.zzbm in (select zzbm from te where te.zzlx='1')connect by PRIOR zzbm=sjzzbm
), te2 as (--第二层,筛选出所有部门级别的层级数据select te1.zzbm,te1.sjzzbm,te1.rt,te1.zzlx,te1.lvfrom te1 where te1.zzlx='2'
), te3 as (--第三层,使用排序开窗函数,区分同一子节点与不同顶点的层级次序select te2.zzbm,te2.sjzzbm,te2.zzlx,te2.rt,te2.lv,row_number() over(partition by te2.zzbm order by te2.lv) ordfrom te2
)
--第四层,对层次次序取最小层级数据,既是需要的最后一级单位
select te3.zzbm,te3.sjzzbm,te3.zzlx,te3.rt,te3.lv,te3.ord
from  te3 where te3.ord=1;

CONNECT_BY_ROOT(顶点列)用来查询当前节点的顶点是谁,Oracle也提供了其他配合使用的内建函数,常用的还有LEVEL关键字,可查询当前节点对应顶点有几层,SYS.CONNECT_BY_PATH(字段名,分隔符)函数,可求出自顶点到该子节点之间的所有节点并用指定的符号分割

最后在提醒读者一句,Oracle中的数据通常较多,推荐你在使用start with时在子节点,也就是案例中的sjzzbm列添加索引,因为在计算时,Oracle需要不断的递归查询该列数据,如果数据量大又无索引,那么效率会相当感人

Oracle 层级数据计算方式start with connect by相关推荐

  1. 未压缩视频数据计算方式

    未压缩视频数据计算方式 1280 x 720的视频码率为604Mbps.我有一个6秒钟的不压缩视频大小为491MB.视频格式显示为RGB.码率的算法也很简单128072024(颜色位数)*30(帧率) ...

  2. oracle sql数据计算精度问题

    问题: 执行sql查询结果a,b , 使用a,b 进行间接计算时,会出现预期为0.01的值 ,但实际查询结果为 0.00999999997 或0.00999999998 但以a, b 数值直接计算时可 ...

  3. 国内行政层级数据查询步骤

    中国最新行政层级数据查询方式 打开此链接:http://www.mca.gov.cn/ (民政局官网)

  4. 华为云大数据存储的冗余方式是三副本_阿里云大数据产品 | 大数据计算

    阿里云大数据计算产品包括MaxCompute.E-MapReduce和实时计算(Alibaba Cloud Realtime Compute). 一.MaxCompute 1.MaxCompute概述 ...

  5. oracle读取数据方式,关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  6. odps传大文件到oss上_【大数据干货】数据进入阿里云数加-大数据计算服务MaxCompute(原ODPS)的N种方式...

    原文链接:http://click.aliyun.com/m/13946/ 想用阿里云大数据计算服务(MaxCompute),对于大多数人首先碰到的问题就是数据如何迁移到MaxCompute中.按照数 ...

  7. spark连接Oracle数据库,Spark通过jdbc采用分区的方式从oracle读数据

    spark通过jdbc可以从oracle中直接读取数据,返回dataframe.有时由于数据量较大,我们可以采用分区方式通过jdbc多线程并行从oracle中读取数据. - oracle中的数据如下 ...

  8. oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!

    oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描.下面先看一下全表扫描. 1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返 ...

  9. 三种数据交换方式的时延计算

    三种数据交换方式的时延计算 part1:什么是时延?有哪三种数据交换方式? 时延指的是计算机网络性能的一种,表示数据从网络的一端传送到另一端所用的时间. 三种数据交换方式:电路交换.报文交换.分组交换 ...

最新文章

  1. JavaScript对象
  2. axios的简单封装和http请求实践
  3. windows中wnmp设置nginx启动脚本
  4. easyui tree复选框是否打钩状态_实战PyQt5: 010-复选框控件QCheckBox
  5. Angular里遇到的一个依赖注入问题以及解决办法
  6. 网站优化之Ajax优化及相关工具
  7. [Java] 蓝桥杯 BEGIN-3 入门训练 圆的面积
  8. 用 iOS-System-Services 框架获取iOS设备所用的设备信息
  9. 路面压电发电,应该有前途
  10. 京东,淘宝,一键批量申请试用!这软件棒棒哒!
  11. 自媒体运营,你要的小工具来了
  12. 导出PDF /home/education/font/simsun.ttc not found as file or resource.
  13. cfa英语不好的怎么学_考CFA,英语太差怎么办?
  14. iPhone4s(iOS 6.1.3 越狱) 登录微信(6.2.0.19)
  15. 街道字符识别_题目理解(datawhale)
  16. iOS开发:对于Xcode的Open Developer Tool中常用功能使用的总结
  17. Canvas和SVG的区别
  18. markdown语法总结
  19. 系统中flvplayer.swf播放器的使用及配置
  20. 光线追踪渲染实战:蒙特卡洛路径追踪及其c++实现

热门文章

  1. 漫反射与高光反射总结
  2. Ext JS框架入门
  3. 牧师与魔鬼 -- version2 动作分离
  4. 计算机视觉技术 - 图像阈值
  5. thinkajax入门------验证ThinkAjax.send 、ajaxReturn
  6. 你也许不知道的5个微信小技巧
  7. [英语] 一个有两个谓语动词的句子之拆解与分析
  8. 手机访问电脑文件ftp服务器,怎么用手机直接访问电脑上的视频文件图片等?
  9. 【定时任务】- 基础篇
  10. 小型便携式AIS接收机dAI01