`

ORACLE查询树型关系 (递归)

阅读更多
ORACLE查询树型关系(start with connect by prior) oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select * from tablename start with cond1 connect by cond2 where cond3; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 用上述语法的查询可以取得这棵树的所有记录。 其中COND1是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 COND2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。 COND3是过滤条件,用于对返回的所有记录进行过滤。 对于oracle进行简单树查询(递归查询) DEPTID NUMBER 部门id PAREDEPTID NUMBER 父部门id(所属部门id) NAME CHAR (40 Byte) 部门名称 通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节点遍历子节点. select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid 可通过level 关键字查询所在层次. select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid PS:start with 后面所跟的就是就是递归的种子,也就是递归开始的地方; connect by prior后面的字段顺序是有讲究的; 若prior缺省:则只能查询到符合条件的起始行,并不进行递归查询; 例: select * from table start with org_id = 'HBHqfWGWPy' connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 用上述语法的查询可以取得这棵树的所有记录。 其中: 条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 条件2 是连接条件,其中用PRIOR表示上一条记录, 比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 条件3 是过滤条件,用于对返回的所有记录进行过滤。 简单介绍如下: 在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 第一步:从根节点开始; 第二步:访问该节点; 第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节点,并执行第二步,否则执行第四步; 第四步:若该节点为根节点,则访问完毕,否则执行第五步; 第五步:返回到该节点的父节点,并执行第三步骤。 总之:扫描整个树结构的过程也即是中序遍历树的过程。 1. 树结构的描述 树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如 EMP 表中的 EMPNO 和 MGR 。 EMPNO 表示该雇员的编号, MGR 表示领导该雇员的人的编号,即子节点的 MGR 值等于父节点的 EMPNO 值。在表的每一行中都有一个表示父节点的 MGR (除根节点外),通过每个节点的父节点,就可以确定整个树结构。 在 SELECT 命令中使用 CONNECT BY 和 START WITH 子句可以查询表中的树型结构关系。其命令格式如下: SELECT 。。。 CONNECT BY {PRIOR 列名 1= 列名 2| 列名 1=PRIOR 裂名 2} [START WITH] ; 其中: CONNECT BY 子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。 PRIORY 运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系, PRIOR 运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。 START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 START WITH: 不但可以指定一个根节点,还可以指定多个根节点。 2. 关于 PRIOR 运算符 PRIOR 被放置于等号前后的位置,决定着查询时的检索顺序。 PRIOR 被置于 CONNECT BY 子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下 的方式。如: CONNECT BY PRIOR EMPNO=MGR PIROR 运算符被置于 CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上 的方式。例如: CONNECT BY EMPNO=PRIOR MGR 在这种方式中也应指定一个开始的节点。 3. 定义查找起始节点 在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。 4.使用 LEVEL 在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为 1 ,根节点的子节点为 2 , 依此类推。 5.节点和分支的裁剪 在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用 WHERE 子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。 6.排序显示 象在其它查询中一样,在树结构查询中也可以使用 ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。 该项目中有Filter表 存有字段: FILTERID CONNECTIVE_TYPE COLUMN_NAME OP_TYPE COMPARABLE_VALUE PARENT_FILTER_ID 查询: SELECT filter_id, connective_type, column_name, op_type, camparable_value, parent_filter_id FROM tidm_evt_filter CONNECT BY PRIOR filter_id = parent_filter_id START WITH filter_id = 'xxx' 删除 DELETE FROM tidm_evt_filter WHERE FILTER_ID in( SELECT filter_id FROM tidm_evt_filter CONNECT BY PRIOR filter_id = parent_filter_id START WITH filter_id = 'xxx' )
分享到:
评论

相关推荐

    ORACLE查询树型关系(connect_by_prior_start_with)

    ORACLE 查询树型关系(connect_by_prior_start_with) Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到...

    Oracle递归树形结构查询功能

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

    oracle 树型的寻父或寻子

    在Oracle数据库中,树型结构的数据模型是一...总的来说,处理Oracle中的树型结构寻父或寻子操作,需要掌握递归查询、索引优化、事务管理等多方面的技术。理解并熟练运用这些技巧,将使你在处理层级数据时更加得心应手。

    一种MySQL数据库SQL递归查询的研究与实现.pdf

    虽然MySQL在处理常规数据操作和查询方面表现出色,但在某些特定功能上,如递归查询,与Oracle和SQL Server等商业数据库相比,存在一定的局限性。在MySQL中,没有内置的递归查询语句,通常需要借助存储过程或存储函数...

    基于Oracle的层次树查询功能及实例分析.pdf

    层次树查询在Oracle数据库中实质上是一种递归查询,它能够有效地解析层次结构数据。以某公司的部门组织结构为例,这些数据存储在Oracle数据库LSYX的BMXX表中,包括部门编码、部门名称、上级部门编码和上级部门名称四...

    将数据库中的内容加入树型控件中,通过建立数据库,再与树型控件

    这通常通过SQL(结构化查询语言)来完成,可以是关系型数据库如MySQL、SQL Server或Oracle,也可以是非关系型数据库如MongoDB或Redis。数据库的设计应考虑实际需求,包括表的结构、字段定义以及数据之间的关系。例如...

    JSP与无限级分类树型菜单

    1. 数据存储:通常,这些分类数据会存储在数据库中,如MySQL或Oracle,每个分类可能有一个父分类ID,通过这个字段可以建立父子关系。 2. 数据获取:使用JDBC(Java Database Connectivity)来连接数据库,执行SQL...

    ADO方式填充树型框.rar

    在.NET编程环境中,我们经常需要将数据库中的数据展示在用户界面上,比如使用树型框(TreeView)来呈现层级关系的数据。"ADO方式填充树型框"是一个关于如何利用ActiveX Data Objects(ADO)技术来将数据库数据动态...

    数据库填充到树型框例程.e.rar

    1. **数据库概念**:首先,我们需要了解数据库的基本概念,如关系型数据库(如MySQL、Oracle、SQL Server)和非关系型数据库(如MongoDB、Redis)。数据库是存储和管理数据的系统,通过SQL(Structured Query ...

    oracle prior

    Oracle Prior 知识点总结 Oracle 中的 Prior 子句是...Oracle 的 Prior 子句提供了一种灵活的方式来查询树状结构表中的数据,可以根据需要指定查询的顺序和范围,并且可以使用 WHERE 子句来限定树型结构中的单个节点。

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

    一种常见的方法是使用递归查询,通过自身连接多次来查找所有子节点。例如,可以使用`WITH RECURSIVE`语句(在支持的SQL版本中,如PostgreSQL、SQL Server 2005及以上)或者使用自连接和JOIN操作(在不支持递归的SQL...

    用SQL形成父子结点树结构的妙法.pdf

    这就需要开发人员利用编程手段来解析树型结构数据并展示为树状视图,这通常是通过递归查询或是使用特殊的GUI控件来实现的。 然而,本文提出了一种不需要特别程序解析,几乎可以使用列表型字典表的处理逻辑,通过一...

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

    例如,在Oracle中,可以利用CONNECT BY子句实现树结构的递归查询,而在IBM DB2中,递归查询的SQL语句由初始查询、递归查询和最终查询三部分组成。但是,MS SQL Server在当时尚未内置递归查询功能,这意味着在MS SQL ...

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

    当我们面对大量结构化数据,例如Excel表格,需要将其导入到关系型数据库如Oracle时,通常会利用编程语言如Java来实现自动化处理。这篇博客“Excel树形结构数据导入Oracle数据库”提供了一个解决方案,下面将详细解析...

    MySQL实现树状所有子节点查询的方法

    在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的功能,我们仍然可以通过其他方法来达到相同的效果。以下将详细介绍几种...

    FOLDERTEST

    这个表单包含了实现文件夹功能的各种组件和逻辑,如按钮、列表框、树型控件等,以及相应的触发器和过程,用于处理用户的交互和数据操作。通过分析这个表单,我们可以学习到如何动态加载和显示文件夹结构,如何实现...

    通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计

    这样,通过Oracle的START WITH...CONNECT BY语句,可以方便地查询出整个菜单树,而无需递归。例如,以下SQL语句可以获取所有一级菜单及其子菜单: ```sql SELECT * FROM T_SYS_MENU START WITH MENU_PID = 0 ...

    计算机二级常考的知识点.pdf

    - **关系数据库管理系统(RDBMS)**:如MySQL、Oracle、SQL Server等。 - **SQL语言**:用于查询、插入、更新和删除数据。 4. **计算机网络**: - **基本概念**:计算机网络是由多个通过通信设施互连的计算机组成...

    JAVA上百实例源码以及开源项目源代码

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

Global site tag (gtag.js) - Google Analytics