引用
这些天做的是分类工作,其中用到了数据库保存树形结构的数据,就是在一个数据库表中储存了多棵树。比如在数据库表“分类表”中有“ID”,“父ID”和“分类名称”三个字段。以下是表结构和数据。
ID 父ID 分类名称
1 A
2 1 B
3 1 C
4 2 D
5 2 E
6 3 F
7 3 H
扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:
第一步:从根节点开始;
第二步:访问该节点;
第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;
第四步:若该节点为根节点,则访问完毕,否则执行第五步;
第五步:返回到该节点的父节点,并执行第三步骤。
从这张表中我们可以知道表中有一棵树,我们要查询这棵树的叶子节点的orcale sql代码是:
select rpad(' ', 2*(level-1), ' ') || t.分类名称 "Name",
connect_by_root t.分类名称 "Root",
connect_by_isleaf "IsLeaf",
level "Level",
sys_connect_by_path(t.分类名称, '/') "Path"
from 分类表 t
where connect_by_isleaf=0
start with t.父id is null
connect by prior t.id = t.父id
order by t.id
下面我们来解释下这个sql中的语法,函数,操作符。
1.语法:
SELECT sql_expn FROM [user.]table
WHERE where_condition
START WITH expn = expn
CONNECT BY [PRIOR] expn = [PRIOR] expn
ORDER BY expn
变量:
sql_expn:有效的SQL表达式
user:表的主人
table: 查询的表名
where_condition:查询的条件
expn:任意有效的表达式
2.函数
1) rpad(char1,n,char2):行数用在字符串char1的右端填充字符串char2,直至字符串的总长度为n,char2的默认值为空格。如果char1的长度大于n,则该行数返回char1左端的n个字符。
2) sys_connect_by_path(字段名, 2个字段之间的连接符号):树结构和它的专用函数,用来显示分支的路径。注意这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,',')。还有,这个函数使用之前必须先建立一个树,否则无用。
3.运算符
1) prior:被放置于等号前后的位置,决定着查询时的检索顺序。
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。例如:
CONNECT BY PRIOR id = 父id
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
CONNECT BY id=PRIOR 父id
2) connect by:说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
3) start with:不但可以指定一个根节点,还可以指定多个根节点
4) level:在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。
5) connect_by_root:用在列名之前返回当前层的根节点(最高级节点的内容)
6) connect_by_isleaf:来判断当前行是不是叶子,如果是叶子就会在伪列中显示1,否则显示 0。
7) connect_by_iscycle:10g中增加对树中环状循环的处理;一旦数据中出现了循环记录(如:两个节点互为对方父节点),在10g以前版本的数据库中会错误提示“ora-01436”,只要指定 nocycle 可避免报错,且通过connect_by_iscycle属性就知道哪些节点产生了循环,如果出现循环,connect_by_iscycle伪列显示为1,否则显示为0。
4.其他
1) 节点和分支的裁剪:在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。
2) 排序显示:order by子句,改变查询结果的显示顺序。
分享到:
相关推荐
最近项目中遇到,开始不太了解,现在分享一下,希望可以帮助其他人
Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...
Oracle树形结构查询,层次查询,hierarchical retrieval Oracle中的树形结构查询,也被称为层次查询或hierarchical retrieval,是一种获取树形结构数据的方法。这种方法可以将数据组织成树形结构,具有层次关系的...
- 网络分析:在社交网络或网络拓扑分析中,树形查询能够帮助找出节点之间的层级连接。 需要注意的是,在使用START WITH...CONNECT BY PRIOR进行查询时,需要考虑到循环引用的问题,因为这样的查询结构容易出现无限...
Oracle 数据库树形结构用法总结,例如SYS_CONNECT_BY_PATH 、START WITH . . . CONNECT BY . . .等具体语法介绍
总结来说,Oracle树形结构结合dtree插件能够帮助开发者有效地展示和操作层次化数据,这对于那些需要直观呈现层级关系的应用场景非常有用。在实际项目中,理解如何使用Oracle的层次查询和dtree插件的配置至关重要,这...
Oracle通常使用自连接来模拟树形结构,即通过一个表中的字段引用自身来建立层级关系。例如,一个"员工"表中,"上级员工ID"字段可以引用"员工ID"字段,形成上下级关系,从而构建出组织结构的树状模型。 查询树结构...
oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询
在这个项目中,Oracle用于存储树形菜单的数据结构,如父节点ID、子节点列表等。JSP通过SQL查询语句从数据库中检索菜单项,并根据需要返回给前端。 **动态树形菜单的实现**: 1. **数据结构设计**:首先,需要在...
Oracle树查询是数据库管理中一种非常实用的技术,它允许我们处理具有层级关系的数据。在Oracle中,树查询主要依赖于`SELECT...START WITH...CONNECT BY...PRIOR`语法,这个语法让我们能够按照层级结构遍历数据。本文...
Oracle 数据库在处理树形数据结构时,提供了一种强大的查询方法,即 `SELECT...START WITH...CONNECT BY...PRIOR` 语法。这种查询模式允许我们以递归方式遍历和检索具有层级关系的数据,例如组织结构、产品分类或者...
Oracle数据库系统在处理层次数据或树形结构时,提供了强大的工具——递归查询。递归查询允许我们在数据表中处理嵌套级别的数据,这在权限查询、组织结构、产品分类等场景中尤其常见。本文将深入探讨Oracle中的树状...
在进行树形查询时,我们通常会用到递归SQL查询或者利用数据库提供的特定功能,如Oracle的CONNECT BY,MySQL的WITH RECURSIVE,或者SQL Server的Hierarchical Queries。这些语法允许我们构建一个层次结构,从根节点...
### Oracle树查询详解 在Oracle数据库中,进行树状结构数据查询时,通常会使用到特定的查询语法,包括`START WITH`、`CONNECT BY PRIOR`等关键字。本文将详细介绍这些关键字及其应用场景,并通过具体示例来帮助理解...
总之,Oracle数据库支持对树形结构数据的高效查询,通过`CONNECT BY`和`START WITH`子句,我们可以轻松地构建和遍历这些层次关系,这对于理解和操作复杂的数据结构至关重要。在进行树结构查询时,理解这些语句的工作...
在本话题中,我们将探讨如何在使用iBatis框架与Oracle数据库时实现树形查询。 首先,iBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,提供了比传统JDBC更高级的抽象层,使得...