浅谈oracle树状结构层级查询

  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. 当前节点遍历子节点(遍历当前部门下所有子部门包括本身)

    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:

    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:

    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不要用逗号。
    文字容易让人疲劳,放图和代码吧!

    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

    结果:


    结束语
    一个坑两周时间填平,最近终于休息闲了下来,整理整理加深记忆,好记性不如烂笔头,不要高估自己的记性,许久不用很快就会忘记的,在学习的道路上,希望自己也希望各位路过的同行不要放弃学习,任重而道远!现在的我很菜,以后我会成为大神!哈哈,意淫一下!
    爱人是路,朋友是树,人生有一条路,一条路上有许多树,有钱的时候别迷路,缺钱的时候靠靠树,幸福的时候莫忘路,休息的时候浇浇树。
    开心一乐
    惊弓之鸟——说的是去面试的刚毕业大学生,一听到用人单位提到行业经验就落荒而逃的事情;
    上联:做 I T 风风雨雨 又一年
    下联:卖电脑 辛辛苦苦 每一天
    横批:从小不学好,长大卖电脑!

浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by的更多相关文章

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

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

  2. oracle树形结构层级查询之start with ....connect by prior、level、order by以及sys_connect_by_path之浅谈

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

  3. oracle 树状结构递归 PL/SQL输出控制 包括空格输出控制

    树状结构 存储过程中通过递归构建,类似BBS回帖显示,代码共三段: 建表,插入数据,创建存储过程显示: 1.create table article(id number primary key,con ...

  4. oracle 树状查询

    做树状查询的时候,oracle有自己的优势,一条sql语句就可以搞定,而mysql这种数据库就只能用递归了... 递归的项目实例: //递归取到栏目路径 public List getTreeList ...

  5. oracle存储过程删除树状结构的表数据

    今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...

  6. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  7. PostgreSQL递归查询实现树状结构查询

    在Postgresql的使用过程中发现了一个非常有意思的功能,就是对于须要相似于树状结构的结果能够使用递归查询实现.比方说我们经常使用的公司部门这样的数据结构.一般我们设计表结构的时候都是相似以下的S ...

  8. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  9. 由简入繁实现Jquery树状结构

    在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...

随机推荐

  1. 团队作业10——复审与事后分析(Beta版本)

    Deadline: 2017-6-13 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目内容为后文的两个方面 Beta阶段项目复审(单独一篇博客) 事后诸葛亮分析报告(单独 ...

  2. A+B Format

    1001.A+B Format (20) github上的object-roiented链接 https://github.com/a877306134/object-oriented/tree/ma ...

  3. 201521123029《Java程序设计》第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 答:1. 课上讲了匿名内部类的使用,其中内部类就是定义在另一个类里面的类,与之相 ...

  4. 201521123109 《java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  5. 将eclipse左边目录结构改为 树形结构

    认情况下Eclipse的显示内容如下: 这种视图我们看起来不太方便,于是我们需要改变一下它的显示结构,我们点击一下下图中蓝色圆圈圈住的图标 在弹出的框中把鼠标放到"package prese ...

  6. mysql 安装-zip版

    1.千万不要自己新建data,使用命令:mysqld --initialize会自动生成一大堆文件 2.没有ini文件就自己新建:

  7. jQuery中的常用内容总结(一)

    jQuery中的常用内容总结(一)   前言 不好意思(✿◠‿◠),由于回家看病以及处理一些其它事情耽搁了,不然这篇博客本该上上周或者上周写的:同时闲谈几句:在这里建议各位开发的童鞋,如果有疾病尽快治 ...

  8. Cnblogs关于嵌入js和css的一些黑科技

    #pong .spoiler{cursor:none;display:inline-block;line-height:1.5;}sup{cursor:help;color:#3BA03B;} Pon ...

  9. jmeter按比例执行业务场景

    可用函数 __counter实现: 函数助手中 找到 __counter,如 ${__counter(false,num)},功能简介 ---- 参数为true,每个用户有自己的计数器 ---- 参数 ...

  10. SQL Server 2016 Alwayson新增功能

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/ 概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alw ...