oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只要精通数据库那么对于java开发你就成功了三分之一,本篇中主要介绍start with...connect by prior 、order by 、sys_connect_by_path。

  概要:树状结构通常由根节点、父节点、子节点和叶节点组成,简单来说,一张表中存在两个字段,dept_id,par_dept_id,那么通过找到每一条记录的父级id即可形成一个树状结构,也就是par_dept_id(子)=dept_id(父),通俗的说就是这条记录的par_dept_id是另外一条记录也就是父级的dept_id,其树状结构层级查询的基本语法是:

  SELECT [LEVEL],*

  FEOM table_name

  START WITH 条件1

  CONNECT BY PRIOR 条件2

  WHERE 条件3

  ORDER BY 排序字段

  说明:LEVEL---伪列,用于表示树的层次

     条件1---根节点的限定条件,当然也可以放宽权限,以获得多个根节点,也就是获取多个树

     条件2---连接条件,目的就是给出父子之间的关系是什么,根据这个关系进行递归查询

     条件3---过滤条件,对所有返回的记录进行过滤。

     排序字段---对所有返回记录进行排序

  对prior说明:要的时候有两种写法:connect by prior dept_id=par_dept_id 或 connect by dept_id=prior par_dept_id,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上的搜索方式(先找叶子节点然后找父节点)。

  树状结构层次化查询需要对树结构的每一个节点进行访问并且不能重复,其访问步骤为:

  

  大致意思就是扫描整个树结构的过程即遍历树的过程,其用语言描述就是:

  步骤一:从根节点开始;

  步骤二:访问该节点;

  步骤三:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;

  步骤四:若该节点为根节点,则访问完毕,否则执行第五步;

  步骤五:返回到该节点的父节点,并执行第三步骤。

  除此之外,sys_connect_by_path函数是和connect  by 一起使用的,在实战中具体带目的具体介绍!

  实战:最近做项目的组织结构,对于部门的各级层次显示,由于这部分掌握不牢固,用最笨的like模糊查询解决了,虽然功能实现了,但是问题很多,如扩展性不好,稍微改下需求就要进行大改,不满意最后对其进行了优化。在开发中能用数据库解决的就不要用java去解决,这也是我一直保持的想法并坚持着。

  对于建表语句及其测试数据我放在另外一篇博客中,需要进行测试的可以过去拷贝运行测试验证下!

  博客地址:浅谈oracle树状结构层级查询测试数据

  在这张表中有三个字段:dept_id 部门主键id;dept_name  部门名称;dept_code 部门编码;par_dept_id   父级部门id(首级部门为 -1);

  1. 当前节点遍历子节点(遍历当前部门下所有子部门包括本身)

    1
    2
    3
    4
    5
    select  t.dept_id, t.dept_name, t.dept_code, t.par_dept_id,  level
    from  SYS_DEPT t
    start  with  t.dept_id =  '40288ac45a3c1e8b015a3c28b4ae01d6'
    connect  by  prior  t.dept_id = t.par_dept_id
    order  by  level , t.dept_code

    结果:

    dept_id=40288ac45a3c1e8b015a3c28b4ae01d6 是客运部主键,对其下的所有子部门进行遍历,同时用  order by level,dept_code 进行排序 以便达到实际生活中想要的数据;共31条数据,部分数据如图所示:

    但是:

      有问题啊,如果你想在上面的数据中获取层级在2也就是level=2的所有部门,发现刚开始的时候介绍的语言不起作用?并且会报ORA-00933:sql命令未正确结束,why?

    这个我暂时也没有得到研究出理论知识,但是改变下where level='2'的位置发现才会可以的。错误的和正确的sql我们对比一下,以后会用就行,要是路过的大神知道为什么,还请告知下,万分感谢!

    错误sql:

    1
    2
    3
    4
    5
    6
    select  t.dept_id, t.dept_name, t.dept_code, t.par_dept_id,  level
    from  SYS_DEPT t 
    start  with  t.dept_id =  '40288ac45a3c1e8b015a3c28b4ae01d6'
    connect  by  prior  t.dept_id = t.par_dept_id
    where  level  '2'
    order  by  level , t.dept_code

    正确sql:

    1
    2
    3
    4
    5
    6
    select  t.dept_id, t.dept_name, t.dept_code, t.par_dept_id,  level 
    from  SYS_DEPT t
    where  level  '2'
    start  with  t.dept_id =  '40288ac45a3c1e8b015a3c28b4ae01d6'
    connect  by  prior  t.dept_id = t.par_dept_id
    order  by  level , t.dept_code


    当然了,这个对其他形式的where过滤所有返回记录没有影响的,这个只是一个例外!

  2. sys_connect_by_path函数求父节点到子节点路径
    简单介绍下,在oracle中sys_connect_by_path与connect by 一起使用,也就是先要有或建立一棵树,否则无用还会报错。它的主要作用体现在path上即路径,是可以吧一个父节点下的所有节点通过某个字符区分,然后链接在一个列中显示。
    sys_connect_by_path(column,clear),其中column是字符型或能自动转换成字符型的列名,它的主要目的就是将父节点到当前节点的“path”按照指定的模式出现,char可以是单字符也可以是多字符,但不能使用列值中包含的字符,而且这个参数必须是常量,且不允许使用绑定变量,clear不要用逗号。
    文字容易让人疲劳,放图和代码吧!

    1
    2
    3
    4
    5
    select  sys_connect_by_path(t.dept_name, '-->' ),t.dept_id, t.dept_name, t.dept_code, t.par_dept_id,  level 
    from  SYS_DEPT t  
    start  with  t.dept_id =  '40288ac45a3c1e8b015a3c28b4ae01d6' 
    connect  by  prior  t.dept_id = t.par_dept_id
    order  by  level , t.dept_code

    结果:

浅谈oracle树状结构层级查询相关推荐

  1. 浅谈oracle树状结构层级查询测试数据

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  2. oracle树状结构层级查询小结--connect by等之测试数据

    1.创建表 (dept_id VARCHAR2(32) not null,dept_name VARCHAR2(128),dept_code VARCHAR2(32),par_dept_id VARC ...

  3. oracle树状排序,Oracle树状结构查询

    oracle用表的形式组织数据,某些数据还呈现树状结构,提供了对这些数据的组织.查询等功能.在扫描树结构表时,要依次访问树中的每一个节点,并且每个节点只能访问一次,其步骤如下: 1:从根节点开始 2: ...

  4. oracle 树状结构一直出现不了_深入解析Oracle ASSM 段头块(PAGETABLE SEGMENT HEADER)结构...

    一.概念介绍 Oracle ASSM(Automatic Segment Space Managed)使用位图来管理数据库中的空间,具有管理简单.高并发等优点,ASSM的整体结构是3层位图块+数据块, ...

  5. oracle 树状结构一直出现不了_SEO站内优化:网站结构优化(十一)

    上文已经对搜索引擎排名机制,以及影响关键词排名的因素进行了全面的讲解,详情查阅SEO入门到精通(十):搜索引擎的排名机制.本文主要讲解站内优化中最为重要的"网站结构优化",为什么说 ...

  6. oracle树状结构递归,Oracle:递归查询(树形结构数据)

    Oracle树形结构数据-相关知识总结 Oracle树形结构数据--基本知识 1.数据组成 2.基本查询 2.1.查询某节点及该节点下的所有子孙节点 SELECT   *      FROM QIAN ...

  7. oracle树状结构图,Oracle 树状查询

    在实际应用中,经常利用数据库保存树状结构的数据,通常用一张表中的两个字段表示,一个是自身的ID,一个是保存父类的ID.在这样具有这种关系中的数据,要求查出的数据具有我们想要的树状显示.这里需要引入Or ...

  8. 从装备合成谈树状结构的应用

    源码下载: 链接: https://pan.baidu.com/s/1DucpIik596W1pkY09FjUew 提取码: n8mq 其中有个文件"类的功能介绍.txt",介绍了 ...

  9. 【算法微解读】浅谈线段树

    浅谈线段树 (来自TRTTG大佬的供图) 线段树个人理解和运用时,认为这个是一个比较实用的优化算法. 这个东西和区间树有点相似,是一棵二叉搜索树,也就是查找节点和节点所带值的一种算法. 使用线段树可以 ...

最新文章

  1. 计算体系架构研究综述与思考
  2. Android知识点小结
  3. SAP Cloud Application Studio避免出现性能问题的一些最佳实践
  4. 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。
  5. OpenShift 4 之Service Mesh教程(5)- 断路器Circuit Breaker
  6. 使用web3和infura开发以太坊ethereum区块链
  7. 【QCustomPlot】1.3 - 运行官方例程Demo,介绍功能
  8. 无线网络WI-FI技术的专业名词解析
  9. Win10 如何将40G大文件极致压缩
  10. MPC5744-LINFlexD
  11. php实现echarts任务关系图,react中使用echarts(人物关系图)
  12. 窗帘可以选择这6种效果不错的颜色 - 好佳居窗帘十大品牌
  13. 2019年浙江大学计算机九推
  14. java学习(多线程)
  15. 【杂项】JZ2440挂载NFS网络文件系统
  16. 量子计算机 最先进国家,中国获得量子霸权,玻色取样取得重大成功,成为当今量子技术最先进的国家。...
  17. 【好文】为什么必须学好.Net Core?怎么样才能弯道超车拿高薪?这样做一周就够了!(文末彩蛋)...
  18. 为什么说量化策略引擎是ricequant量化的重要部分?
  19. 2016考试计算机知识基础题库,计算机考试题库:计算机基础练习题(58)
  20. vue路由无痕浏览nodeJS环境搭建ElementUI简介

热门文章

  1. GPL和LGPL协议
  2. 大数据营销模型思路架构
  3. swift 代码加载xib storyboard
  4. access文件放置服务器,怎么把access数据库放服务器上
  5. 基于Qt/C++的音频转换程序,pcm互转wav,位数转换
  6. three.js加载三维模型(obj文件mtl文件)
  7. 利用FME自动生成CAD图框
  8. java调用百度内容审核接口检查文本
  9. 用 python 脚本,把当前目录及子目录下的 wav 音频文件转换为 flac 格式
  10. SPH模拟超高速碰撞——基于Ls-Prepost和Ls-Dyna