`
zjx2388
  • 浏览: 1329008 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle数据库遍历树形结构表[转]

阅读更多

1、从根结点开始找子节点

/*
create table test (id  int ,pid int ,name varchar(10));
insert into test values ( 1, 0 ,'n1' );
insert into test values(  2, 1 ,'n12');
insert into test values(  3, 1 ,'n13');
insert into test values(  4, 2 ,'n21');
insert into test values(  5, 2 ,'n22');
insert into test values(  6, 3 ,'n31');
insert into test values(  7, 3 ,'n32');
insert into test values(  8, 4 ,'n211');
insert into test values(  9, 4 ,'n212');
*/
/*
从根结点开始找子节点(可以指定节点层级)
*/

select id,pid,name ,level from test
--where level =3
start with id =2
connect by prior id =  pid;

 

2、从叶结点开始找根节点

/*
create table test (id  int ,pid int ,name varchar(10));
insert into test values ( 1, 0 ,'n1' );
insert into test values(  2, 1 ,'n12');
insert into test values(  3, 1 ,'n13');
insert into test values(  4, 2 ,'n21');
insert into test values(  5, 2 ,'n22');
insert into test values(  6, 3 ,'n31');
insert into test values(  7, 3 ,'n32');
insert into test values(  8, 4 ,'n211');
insert into test values(  9, 4 ,'n212');
*/
/*
从叶结点开始找根节点
prior 关键字 与谁放在一起,就是找谁
根节点的父节点不能是他本身,那会造成死循环
*/

select *  from test /*where conditions*/
start with id=7
connect by id = prior pid;

 

 

 

connect by 是结构化查询中用到的,其基本语法是:
select ... from tablename start by cond1
connect by cond2
where cond3;
简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中COND1是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
COND2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。
COND3是过滤条件,用于对返回的所有记录进行过滤。
PRIOR和START WITH关键字是可选项
PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR
运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是
自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为
可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询
条件的行作为根节点。
完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR ID = PID


以上主要是针对上层对下层的顺向递归查询而使用start with ... connect by prior ...这种方式,但有时在需求需要的时候,可能会需要由下层向上层的逆向递归查询,此是语句就有所变化:例如要实现 select * from table where id in ('0','01','0101','0203','0304') ;现在想把0304的上一级03给递归出来,0203的上一级02给递归出来,而01现在已经是存在的,最高层为0.而这张table不仅仅这些数据,但我现在只需要('0','01','0101','0203','0304','02','03')这些数据,此时语句可以这样写SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR PID = ID START WITH ID IN ('0','01','0101','0203','0304') );

其中START WITH ID IN里面的值也可以替换SELECT 子查询语句.


注意由上层向下层递归与下层向上层递归的区别在于START WITH...CONNECT BY PRIOR...的先后顺序以及 ID = PID 和 PID = ID 的微小变化!

 

 

分享到:
评论

相关推荐

    Excel树形结构数据导入Oracle数据库(Java)

    这篇博客“Excel树形结构数据导入Oracle数据库”提供了一个解决方案,下面将详细解析这个过程。 首先,我们需要理解Excel数据的树形结构。在Excel中,数据可能以层次化的形式存在,比如一级分类、二级分类等,形成...

    Oracle递归树形结构查询功能

    Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...

    数据库控制树形结构的生成

    许多数据库系统如MySQL、PostgreSQL、Oracle等提供了内置的树形数据类型或函数,如Nested Sets Model、Materialized Path等,以及支持树操作的库,如Python的`sqlalchemy`和`pytree`,可以帮助简化树形结构的管理和...

    MS SQL Server树形结构表遍历的循环算法.pdf

    在三大主流数据库系统中,Oracle和IBM DB2均内置了递归查询的实现,能够高效地遍历树形结构表。例如,在Oracle中,可以利用CONNECT BY子句实现树结构的递归查询,而在IBM DB2中,递归查询的SQL语句由初始查询、递归...

    oracle树形结构,结合dtree插件使用显示树状结构菜单

    Oracle数据库在许多企业级应用中扮演着核心角色,它的数据组织方式之一是树形结构,这种结构对于管理和展示层次化数据非常有效。本主题将深入探讨如何在Oracle中利用树形结构以及如何结合dtree插件来显示树状结构...

    树形结构数据库设计

    - 使用START WITH和CONNECT BY:Oracle数据库提供了特有的语法来查询树形结构。START WITH定义查询的起点,CONNECT BY定义了如何从一个节点移动到其子节点。 - 使用WITH RECURSIVE:在标准SQL中,WITH语句可以创建...

    edb数据库保存树形框分支结构源码

    另外,层次查询语言(如PostgreSQL的`WITH RECURSIVE`)可能被用来遍历树形结构。 7. **编程语言**:虽然未明确指出,但考虑到数据库操作,源码可能是用SQL配合某种后端编程语言(如Python、Java、C#)实现的。 8....

    JAVA实现Excel表数据导入ORACLE数据库.txt

    ### JAVA实现Excel表数据导入ORACLE数据库 #### 知识点概述 本文将详细介绍如何使用Java编程语言将Excel表格中的数据导入到Oracle数据库中。这一过程涉及到的关键技术包括:使用JDBC连接Oracle数据库、通过ODBC...

    Oracle SQL树形结构查询

    Oracle SQL树形结构查询是一种在数据库中处理层级数据的有效方法,特别是在具有层级关系的数据表中,如组织架构、部门树或文件系统等。Oracle SQL 提供了 `START WITH...CONNECT BY PRIOR` 语句来实现递归查询,使得...

    Android Oracle数据库使用手册源码,使用技术多层树,Fragmnet,左右滑动,焦点解决

    在Android中,我们可以使用ExpandableListView或者自定义ViewGroup实现树形结构。每个节点可以包含子节点,通过递归遍历数据结构,动态生成对应的视图层次。这在处理分层级的数据,如组织架构、菜单系统时非常实用。...

    无限级树形菜单(Sql数据库)

    为了展示无限级树形菜单,我们可以使用编程语言(如Java、C#、Python等)与数据库交互,将查询结果转换成树形结构。这通常涉及递归函数,遍历查询结果并构建树节点。每个节点包含其自身的属性(如名称、URL等),...

    oracle树结构查询方法

    总之,Oracle数据库支持对树形结构数据的高效查询,通过`CONNECT BY`和`START WITH`子句,我们可以轻松地构建和遍历这些层次关系,这对于理解和操作复杂的数据结构至关重要。在进行树结构查询时,理解这些语句的工作...

    银行数据库面试题.docx

    * 树形结构的查询:包括树形结构的查询、树形结构的遍历等。 八、PowerDesigner PowerDesigner 是一个数据库设计工具,用于设计、开发、维护数据库。PowerDesigner 的目的是为了提高数据库的性能、可靠性和可维护...

    Oracle树结构查询(图)

    Oracle通常使用自连接来模拟树形结构,即通过一个表中的字段引用自身来建立层级关系。例如,一个"员工"表中,"上级员工ID"字段可以引用"员工ID"字段,形成上下级关系,从而构建出组织结构的树状模型。 查询树结构...

    vc数据库里面树的应用,如何从数据库里面读取并且连接到树

    首先,通过CDatabase::OpenEx方法连接到数据库,然后创建CRecordset对象,设置SQL查询语句以获取树形结构所需的数据。数据通常包括父节点和子节点信息,例如ID、父ID、名称等字段。 2. ADO:利用CDaoDatabase和...

    数据库-表-树节点读取.rar

    本资源“数据库-表-树节点读取.rar”显然聚焦于如何在数据库环境中处理具有层级关系的数据,比如树形结构。树节点读取在数据库设计中尤其常见,特别是在需要表示层次结构的数据,如组织架构、文件系统或分类目录时。...

    递归查询菜单树,支持mysql,oracle

    在构建应用程序时,特别是涉及到用户界面的交互,如菜单系统,我们经常需要将数据组织成层次结构,例如树形结构。这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的...

Global site tag (gtag.js) - Google Analytics