oracle树状排序,Oracle树状结构查询
发布日期:2021-06-24 16:18:28 浏览次数:3 分类:技术文章

本文共 1593 字,大约阅读时间需要 5 分钟。

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

1:从根节点开始

2:访问该节点

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

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

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

总之,整个扫描过程是一个中序遍历树的过程

1:树结构描述

数据之间的层次关系(父子关系)通过表中列与列之间的关系来描述

select

connect by {prior col1 = col2 || col1 = prior col2 }

[start with ]

connect by子句说明数据按照层次顺序检索,并将数据连入树形结构关系中

prior运算符必须放在连接关系的两列中某一列的前面,从而确定查找顺序是自上而下还是自下而上,连接关系中,可使用列名、列表达式

start with 子句为可选项,用来标识查找结构的根节点。若省略,则表示所有满足条件的行作为根节点

2:关于prior

prior和父列子列的相对位置,决定着查询方向。放在子节点前面是表示由父节点向子节点方向检索,放在父节点前面时表示从子节点向父节点方向检索,可以将prior想象成一个箭头,放在谁的前面,就向那个方向检索。

3:定义起始查找节点

不但可以从根节点开始,而且可以定义任何节点为起始节点

start with可指定一个或多个根节点

4:使用level

节点所处位置不同,每行记录都有一个层号,层号有节点与根节点的距离决定。无论从哪个节点开始,该其实根节点的层号始终为1,依次类推

伪列level显示每行数据的有关层次,返回属性结构中当前节点的层次,可用来控制对树形结构进行遍历的深度,伪列level为数值型,可与lpad、rpad等结合进行数据展示

5:节点和分支的剪裁

where子句限定单个节点,而不影响其子节点(自上而下)或父节点(自下而上)

connect by 子句限定整个以当前节点为起始节点的整个分支

两者可联合使用

6:排序显示

order by子句,改变查询结果的显示顺序

在10g又增加了几个新的特性,增强了connect by子句:

从9i开始,可通过sys_connect_by_path函数实现从父节点到当前行内容以”path“或者层次元素列表的形式显示出来。sys_connect_by_path(child,'/')

connect_by_root,用在列名之前返回当前层的根节点(最高级节点的内容)

connect_by_isleaf,来判断当前行是不是叶子,如果是叶子就会在伪列中显示1

connect_by_iscycle,10g中增加对树中环状循环的处理;一旦数据中出现了循环记录(如:两个节点互为对方父节点),在10g以 前版本的数据库中会错误提示”ora-01436。。“,只要指定nocycle可避免报错,且通过connect_by_iscycle属性就知道哪些 节点产生了循环,如果出现循环,connect_by_iscycle伪列显示为1,否则显示为0。

select connect_by_iscycle, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname

from t_tonedirlib

start with fatherindex = 666

connect by NOCYCLE fatherindex = prior dirindex

特殊用法:

得到1到10的一个序列

select rownum from dual

connect by rownum<=10

转载地址:https://blog.csdn.net/weixin_33765959/article/details/116491553 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:oracle 创建crc32函数,文件Crc32校验追加以及文件Crc32校验(0xEDB88320) | 学步园
下一篇:php函数内的循环,PHP 循环列出目录内容的函数代码

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月14日 15时26分56秒