树的裁据表_Oracle 树操作、递归查询(select…start with…connect by…prior)
1、准备测试表和测试数据
parent字段存储的是上级id,如果是顶级父节点,该parent为null(得补充一句,当初的确是这样设计的,不过现在知道,表中最好别有null记录,这会引起全文扫描,建议改成0代替)。
2、树操作
我们从最基本的操作,逐步列出树查询中常见的操作,所有查询出来的节点以家族中的辈份作比方。
1)、查找树中的所有顶级父节点(辈份最长的人)。 假设这个树是个目录结构,那么第一个操作总是找出所有的顶级节点,再根据该节点找到其下属节点。
2)、查找一个节点的直属子节点(所有儿子)。 如果查找的是直属子类节点,也是不用用到树型查询的。
3)、查找一个节点的所有直属子节点(所有后代)。
这个查找的是id为1的节点下的所有直属子类节点,包括子辈的和孙子辈的所有直属节点。
4)、查找一个节点的直属父节点(父亲)。 如果查找的是节点的直属父节点,也是不用用到树型查询的。
5)、查找一个节点的所有直属父节点(祖宗)。
这里查找的就是id为1的所有直属父节点,打个比方就是找到一个人的父亲、祖父等。但是值得注意的是这个查询出来的结果的顺序是先列出子类节点再列出父类节点,姑且认为是个倒序吧。
上面列出两个树型查询方式,第3条语句和第5条语句,这两条语句之间的区别在于prior关键字的位置不同,所以决定了查询的方式不同。 当parent = prior id时,数据库会根据当前的id迭代出parent与该id相同的记录,所以查询的结果是迭代出了所有的子类记录;而prior parent = id时,数据库会跟据当前的parent来迭代出与当前的parent相同的id的记录,所以查询出来的结果就是所有的父类结果。
以下是一系列针对树结构的更深层次的查询,这里的查询不一定是最优的查询方式,或许只是其中的一种实现而已。
6)、查询一个节点的兄弟节点(亲兄弟)。
7)、查询与一个节点同级的节点(族兄弟)。 如果在表中设置了级别的字段,那么在做这类查询时会很轻松,同一级别的就是与那个节点同级的,在这里列出不使用该字段时的实现!
这里使用两个技巧,一个是使用了level来标识每个节点在表中的级别,还有就是使用with语法模拟出了一张带有级别的临时表。
8)、查询一个节点的父节点的的兄弟节点(伯父与叔父)。
这里查询分成以下几步。
首先,将第7个一样,将全表都使用临时表加上级别;
其次,根据级别来判断有几种类型,以上文中举的例子来说,有三种情况:
(1)当前节点为顶级节点,即查询出来的lev值为1,那么它没有上级节点,不予考虑。
(2)当前节点为2级节点,查询出来的lev值为2,那么就只要保证lev级别为1的就是其上级节点的兄弟节点。
(3)其它情况就是3以及以上级别,那么就要选查询出来其上级的上级节点(祖父),再来判断祖父的下级节点都是属于该节点的上级节点的兄弟节点。
最后,就是使用union将查询出来的结果进行结合起来,形成结果集。
9)、查询一个节点的父节点的同级节点(族叔)。
这个其实跟第7种情况是相同的。
基本上,常见的查询在里面了,不常见的也有部分了。其中,查询的内容都是节点的基本信息,都是数据表中的基本字段,但是在树查询中还有些特殊需求,是对查询数据进行了处理的,常见的包括列出树路径等。
补充一个概念,对于数据库来说,根节点并不一定是在数据库中设计的顶级节点,对于数据库来说,根节点就是start with开始的地方。
下面列出的是一些与树相关的特殊需求。
10)、名称要列出名称全部路径。
这里常见的有两种情况,一种是从顶级列出,直到当前节点的名称(或者其它属性);一种是从当前节点列出,直到顶级节点的名称(或其它属性)。举地址为例:国内的习惯是从省开始、到市、到县、到居委会的,而国外的习惯正好相反(老师说的,还没接过国外的邮件,谁能寄个瞅瞅 )。
从顶部开始:
从当前节点开始:
在这里我又不得不放个牢骚了。oracle只提供了一个sys_connect_by_path函数,却忘了字符串的连接的顺序。在上面的例子中,第一个sql是从根节点开始遍历,而第二个sql是直接找到当前节点,从效率上来说已经是千差万别,更关键的是第一个sql只能选择一个节点,而第二个sql却是遍历出了一颗树来。再次ps一下。
sys_connect_by_path函数就是从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串,这个功能还是很强大的。
11)、列出当前节点的根节点。
在前面说过,根节点就是start with开始的地方。
connect_by_root函数用来列的前面,记录的是当前节点的根节点的内容。
12)、列出当前节点是否为叶子。
这个比较常见,尤其在动态目录中,在查出的内容是否还有下级节点时,这个函数是很适用的。
connect_by_isleaf函数用来判断当前节点是否包含下级节点,如果包含的话,说明不是叶子节点,这里返回0;反之,如果不包含下级节点,这里返回1。
至此,oracle树型查询基本上讲完了,以上的例子中的数据是使用到做过的项目中的数据,因为里面的内容可能不好理解,所以就全部用一些新的例子来进行阐述。以上所有sql都在本机上测试通过,也都能实现相应的功能,但是并不能保证是解决这类问题的最优方案(如第8条明显写成存储过程会更好).
树的裁据表_Oracle 树操作、递归查询(select…start with…connect by…prior)相关推荐
- Oracle 树操作(select…start with…connect by…prior)
oracle树查询的最重要的就是select-start with-connect by-prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的 ...
- 树的裁据表_主要树种材积表
树种 起源 公式 C 0 C 1 C 2 云南松 天然 V= C 0 *D C1 * H C2 0.0000582901175 1.9796340 0.90715155 云杉 天然 V= C 0 *D ...
- [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习
作者最近在复习考博,乘此机会分享一些计算机科学与技术.软件工程等相关专业课程考题,一方面分享给考研.考博.找工作的博友,另一方面也是自己今后完成这些课程的复习资料,同时也是在线笔记.基础知识,希望对您 ...
- Java中的查找树和哈希表(一级)
下面我们来看一下JAVA中有哪些查找树和哈希表,我们分两块内容来讲呗,第一块我们首先来讲查找树,第二块我们来讲哈希表,JAVA里面我们有一个TreeSet,还有一个TreeMap,他们底层都是使用了红 ...
- 数据库表TreeView树的快速生成
数据库表TreeView树的快速生成 根据数据表的内容生成TreeView树状结构,通常的做法就是从顶级开始,然后逐项递归查询遍历生成.这种方法在实现上容易做到,也很容易想到,但是效率比较低,因为数据 ...
- Mysql的索引为什么使用B+树而不使用跳表?
在我们的印象中,mysql数据表里无非就是存储一行行的数据.跟个excel似的. 直接遍历这一行行数据,性能就是O(n),比较慢.为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg(n)) ...
- 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论
序言: 经过长达十几天的集训,确实学了不少知识点.我想如果再不总结的话,6天之后又要忘完了. 所以发一篇具有总结回忆性的博客,供大家回忆. 目录会本人自己排列的时间的先后顺序来排列,可直接食用. 目录 ...
- LSM树——Log-Structured Merge-Tree数据结构、LSM树设计思想、LSM的数据写入操作、LSM的数据查询操作
LSM树数据结构 简介 传统关系型数据库,一般都选择使用B+树作为索引结构,而在大数据场景下,HBase.Kudu这些存储引擎选择的是LSM树.LSM树,即日志结构合并树(Log-Structured ...
- 数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)
文章目录 前言 正文(无删减) 我的想法(删减修改版) 数据导入与数据存储 功能实现 数据结构 用户结构 SIM卡结构 AVL树数据结构 哈希表结构 数据表 用户表 SIM卡表 时间安排 前言 本月主 ...
最新文章
- Andriod anim 补间(Tween)动画与Interpolator以及setCustomAnimations方法
- java 对错代厔_如何获得汉字拼音的首字母序列
- php 漏洞扫描,Webvulscan:一款基于PHP的漏洞扫描器
- Redis详细使用文档记录
- 软件工程实践—软件评测
- matlab中时域逐步积分方法,newmark积分法
- 2021-08-02 html css 考试题改错
- 教你如何在快应用中跳转到Android的app
- 位运算——左移和右移
- 【GDOI2017模拟11.7】太阳神
- hive的开窗函数篇
- 2. 彤哥说netty系列之IO的五种模型
- NASA表示金星轨道尘埃环可能为一群未检测过的共轨小行星
- 【转】腾讯 百度 网易游戏 华为Offer及笔经面经
- CES Asia专题|栩栩如生!Artec3D现场展示其3D扫描技术
- 【BZOJ 1115】【POI 2009】石子游戏Kam
- Java Validation Api 详解
- Hrm-人力资源系统开发笔记05
- 金仓KingbaseES中数据库逻辑备份总结
- ORACLE报错:ORA-01788: CONNECT BY clause required in this query block