浅谈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. Beta版本冲刺计划及安排(附七天冲刺的博客链接)

    Beta版本冲刺计划及安排(附七天冲刺的博客链接) 新增组员 本次换人加入我们团队的新成员是原"爸爸说的都队"的队长念其锋同学,经过我们小组严格的两轮面试,他从几个同样前来面试的同 ...

  2. java--利用exe4j生成.exe的可执行文件

    工具:eclipse,exe4j,jre,这三个都可以直接在官方网站下载,下面所用到的都是最新版的. 前期准备:用eclipse编好需要生成.exe文件的project,另外exe4j需要一个注册码, ...

  3. Java学习7——一些注意的地方

    (学习运算符.if和switch分支.for与while与do...while循环.break和continue.递归,内容和C++没差,挑了几个注意点) 运算符 逻辑与(&)和短路与(&am ...

  4. 201521123090《JAVA程序设计》第二周学习总结

    1. 本章学习总结 java基本数据类型 String类对象使用 枚举类型及switch分支 容器的概念 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代 ...

  5. self、parent和$this关键字

    self.parent和$this关键字的区别: self关键字用来指定当前的类,而且该关键字通常用来访问类的静态成员.方法和常量.parent关键字用于指向父类,所以使用该关键字调用父类的属性和方法 ...

  6. json:JSONObject与JSONArray的使用

    1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar commons ...

  7. 火狐html5拖拽 弹出新页面解决办法

    今天做项目时,需要实现一个拖拽排序的功能,遂想到了html5的拖拽,便开始查资料,写代码.功夫不复有心人,通过网上资料作参考,排序功能成功实现.谷歌浏览器测试,拖拽平滑,无问题.火狐浏览器测试时,却无 ...

  8. SpringMVC第三篇【收集参数、字符串转日期、结果重定向、返回JSON】

    业务方法收集参数 我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量,该成员变量的名字与web端带过来的名称是要一致的-并且,给出该成员变量的set方法,那么Struts2的拦截器 ...

  9. 开发中mysql和oracle的区别

    首先就不描述mysql与oracle在整个数据库系统上的区别了,仅从程序员开发的角度来说: 1.主键: mysql一般会用到一个自增的属性,例如设置一个id字段,类型设置为auto increment ...

  10. Ansible系列(六):循环和条件判断

    本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...