Oracle SQL树形结构查询

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 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。

===================补充===================

Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。

创建示例表:

代码如下:

CREATE TABLE TBL_TEST
(
 ID NUMBER,
 NAME VARCHAR2(100 BYTE),
 PID NUMBER DEFAULT 0
);

插入测试数据:

代码如下:

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');

从Root往树末梢递归

代码如下:

select * from TBL_TEST
start with id=1
connect by prior id = pid

从末梢往树ROOT递归

代码如下:

select * from TBL_TEST
start with id=5
connect by prior pid = id

(0)

相关推荐

  • Oracle 11g Release (11.1) 索引底层的数据结构

    本文内容 B-树(B-tree) 散列(Hash) k-d 树(k-d tree) 点四叉树(Point Quadtree) 本文介绍关于 Oracle 索引的结构.大概了解 Oracle 索引底层的数据结构,从而更好地理解 Oracle 索引对增.删.改.查的性能. B-树(B-tree) 非索引的结构能满足所有需要,但自平衡的 B-树索引结构更能优化在大数据集上检索的性能.每个 B-树节点拥有多个键和指针.特定 B-树支持的一个节点中键的最大数量是那颗树的顺序.每个节点都具有一个潜在的 or

  • oracle复制表结构和复制表数据语句分享

    1. 复制表结构及其数据: 复制代码 代码如下: create table table_name_new as select * from table_name_old 2. 只复制表结构: 复制代码 代码如下: create table table_name_new as select * from table_name_old where 1=2; 或者: 复制代码 代码如下: create table table_name_new like table_name_old 3. 只复制表数据

  • oracle 数据库学习 基本结构介绍

    普及一下oracle的基础知识,总结一下,oracle 是由实例和数据库组成.结构如下: oracle数据库由实例.数据库组成: * 数据库由数据文件(包含oracle 数据.索引.表结构等数据).控制文件(包括每个表的操作信息).日志文件(数据操作sql语句).参数文件.口令文件.日志归档文件(归档模式下)(服务器崩溃.硬盘损坏情况下,通过日志恢复时用) * 实例由 内存结构(memory strutct) 和 后台进程(background processor)组成. 内存结构组成: * P

  • oracle逻辑结构分析

    oracle的逻辑结构包括表空间(tablespace),段(segment),区(extent),数据块(data block) oracle数据库在逻辑上是由多个表间组成的,表空间中存储的对象叫段,比如数据段,索引段,和回退段.段由区组成,区是磁盘分配的最小单位.段的增大是通过增加区的个数来实现的.每个区的大小是数据块大小的整数倍,区的大小可以不相同:数据块是数据库中最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位.块的大小由参数DB_BLOCK_SIZE设置,其值应设

  • Oracle中scott表结构与简单查询实例分析

    本文实例讲述了Oracle中scott表结构与简单查询的方法.分享给大家供大家参考.具体分析如下: 1.scott用户的表的结构 查看表结构 desc 表名;//desc emp; emp表: SQL> desc emp; 名称 是否为空? 类型 ----------------- -------- ------------ EMPNO NOT NULL NUMBER(4) 雇员编号 ENAME VARCHAR2(10) 雇员姓名 JOB VARCHAR2(9) 雇员职位 MGR NUMBER(

  • BS结构中使用PHP访问ORACLE LOB

    PHP,即"PHP: Hypertext Preprocessor",是一种广泛用于 Open Source(开放源代码)并可以嵌入 HTML 的多用途脚本语言.它的语法接近 C.Java 和 Perl,易于学习.该语言的主要目标是让 Web 开发人员快速的书写动态生成的网页,然而,PHP 的功能并不局限于此.PHP普遍被认为可以更快和更有效地实现复杂的编程任务,而且正是因为它的更稳定以及占用更少资源的优点成为开发B/S结构系统的必备的WEB脚本设计语言,扮演着类似中间件的角色,即语法

  • Oracle SQL树形结构查询

    oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: 复制代码 代码如下: select * from tablename start with cond1 connect by cond2 where cond3; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构. 用上

  • Oracle递归树形结构查询功能

    oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的. 概要:树状结构通常由根节点.父节点.子节点和叶节点组成,简单来说,一张表中存在两个字段,dept_id,par_dept_id,那么通过找到每一条记录的父级id即可形成一个树状结构,也就是par_dept_id(子)=dept_id(父),通俗的说就是这条记录的par_dept_id是另外一条记录也就是父级的dept_id,其树状结构层级查询的基本语法是: SELECT [

  • sqlserver 树形结构查询单表实例代码

    --树形sql查询 WITH TREE AS( --创建一个虚拟表 SELECT * FROM sys_organiz --指定需要查询的表 WHERE organize_code = '100000' -- 指定父节点条件 UNION ALL --联合查询 SELECT sys_organiz.* FROM sys_organiz,TREE WHERE TREE.organize_code = sys_organiz.organize_parent_code ) SELECT * FROM T

  • SpringBoot+MyBatisPlus+MySQL8实现树形结构查询

    本文实例为大家分享了SpringBoot+MyBatisPlus+MySQL8实现树形结构查询,供大家参考,具体内容如下 场景: 今天在实现权限功能模块时,需要将查询的权限数据,以树形结构的方式返回给前端. 功能实现: 第一步:权限表结构定义及其功能演示数据. DROP TABLE IF EXISTS `baoan_privilege`; CREATE TABLE `baoan_privilege` ( `id` varchar(64) CHARACTER SET utf8 COLLATE ut

  • springboot+mybatis plus实现树形结构查询

    目录 背景 使用场景 设计思路 递归模型 实现代码 注意事项 总结 背景 实际开发过程中经常需要查询节点树,根据指定节点获取子节点列表,以下记录了获取节点树的操作,以备不时之需. 使用场景 可以用于系统部门组织机构.商品分类.城市关系等带有层级关系的数据结构: 设计思路 递归模型 即根节点.枝干节点.叶子节点,数据模型如下: id code name parent_code 1 10000 电脑 0 2 20000 手机 0 3 10001 联想笔记本 10000 4 10002 惠普笔记本 1

  • oracle sql语言模糊查询--通配符like的使用教程详解

    oracle在Where子句中,可以对datetime.char.varchar字段类型的列用Like子句配合通配符选取那些"很像..."的数据记录,以下是可使用的通配符: %   零或者多个字符 _    单一任何字符(下划线) \     特殊字符 oracle10g以上支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,RE

  • 树形结构数据库表Schema设计的两种方案

    目录 前言 一.基本数据 二.继承关系驱动的Schema设计 三.基于左右值编码的Schema设计 四.树形结构CRUD算法 (1)获取某节点的子孙节点 (2)获取某节点的族谱路径 (3)为某节点添加子孙节点 (4)删除某节点 五.总结 前言 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS

  • Mysql树形结构的数据库表设计方案

    目录 前言 一.基本数据 二.继承关系驱动的设计 三.基于左右值编码的设计 四.树形结构CRUD算法 (1)获取某节点的子孙节点 (2)获取某节点的族谱路径 (3)为某节点添加子孙节点 (4)删除某节点 五.总结 参考文献 前言 最近研究树形菜单网上找了很多例子看了.一下是网上找的一些资料,然后自己重新实践,记录下免得下次又忘记了. 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化.然而目前的各

  • 详细聊一聊mysql的树形结构存储以及查询

    目录 序 存储parent 存储path MPTT(Modified Preorder Tree Traversal) 小结 doc 序 本文主要研究一下mysql的树形结构存储及查询 存储parent 这种方式就是每个节点存储自己的parent_id信息 建表及数据准备 CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `parent_id` int(11) NOT

  • ORACLE SQL语句优化技术要点解析

    操作符优化: IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询. 由此可见用IN的SQL至少多了一个转换的过程.一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了. 推荐方案:

随机推荐