`

oracle查询树结构二

 
阅读更多

oracle的家族树介绍

 

oracle的家族树为oraclefens提供了一个很方便的从顶向底,或者从底到顶的查找功能.语法如下:

select column from table_name start with column=value
connect by prior
父主键=子主键

我下面以一个简单的公司雇员为例(就是上下级的信息放在一张表里,但是有一个字段来关联上下级的信息),具体解释oracle的家族树的用法:

t_emptree:

1)建表语句:

  ENAME VARCHAR2(20) primary key not null,    ----职员名称

  EMPNO NUMBER not null,     -----职员编号

  MGR   NUMBER default 0 not null  ---上级编号

2)插入数据:

   

 

31、从顶到底列出雇员boss的下属信息

SQL> select ename,empno,mgr from t_emptree start with mgr=0

2        connect by prior empno=mgr;

注:因为mgrtypenumber所以使用mgr=0。在一般情况下mgr上级编号的type

    varchar2所以使用mgr is null.

 

start with :表示从哪一条记录开始查。在这儿表示从mgr=0开始查,即从最高的父级开始从上往下查,查出boss的直属下属和其他的下属。

connect by prior表示根据子主键mgr)开始查起。 如果反过来,则是根据父主键(empno)查起。

 

2.使用参数level从顶到底列出雇员boss的下属信息

       SQL>  select ename,empno,mgr,level from t_emptree start with mgr=0

  2  connect by prior empno=mgr;

      

  Level是伪列,表示深度

 

3.使用参数lpad()

SQL>  select lpad('*',4*(level-1),'#')||ename name,empno,mgr,level from t_emptree

  2   start with mgr=0

  3   connect by prior empno=mgr;

 

 

 

lpad( string1, padded_length, [ pad_string ] ) LPad的意思在某个值的左边加上一定的字符,默认的情况下是空格,也就是说,如果等级是一那么就加一个空格,如果是2那么就加两个空格。

例如:lpad('* ',4*(level-1)’#’)||(注:“||”是必须的)

第一个参数string1(’* ’)表示:在我查询的第一个字段(用||分割)ename左边加一个字符“*”。

第二个参数padded_length(4*(level-1))表示:根据level 添加不同数目(4*level-1-1)个的第三个参数(pad_string)(比如level=2时就添加4string,其中一个“*”和3个“#”)。

第三个参数pad_string(“#”)表示:显示根据第二个参数的数量减一后的“#”个数。(也就是说,第三个参数显示的数量加上第一个参数显示的数量必须等于第     二个参数的数量)

在一般情况下:

第一个参数是必写的一般是空格。

第二个参数是必写的一般都使用level来进行计算。“||”也是必写的

第三个参数可以不写,默认为空格。

 

 

4、遍历至根(从上至下或从下至上)
a)
从某个雇员开始向他的上级列出该雇员的层次结构,如他的直接上司,以及其他的上司。(从底到顶)

SQL> col ename for a30;
SQL>  select lpad(' ',4*(level-1))||ename ename,mgr,empno,level from t_emptree

  2   start with mgr=4 connect by prior mgr=empno;

 

 

col ename for a30指定列的输出格式: 30个固定字符长度,如果字段的实际长度超过30个字符,那么会换下一行显示.(也可以是a20,a60等)。

 

b)从某个雇员开始向下列出该雇员的层次结构,如他的直接下属,以及其他的下属。(从顶到底)

SQL>select lpad(' ',4*(level-1))||ename ename,mgr,empno,level from t_emptree

 start with mgr=4 connect by prior empno=mgr;

 

注:connect by prior父主键=子主键:表示根据子主键(mgr)开始查起(一般是从顶到底)。 如果反过来,则是根据父主键(empno)查起(一般是从底到顶)。

 

5列出所有雇员的层次结构

a) 这个子句可以很清楚的完成整个树的从底到顶的遍历功能。(因为条件start with mgr<>0放宽限定条件,以取得多个根结点,实际就是多棵树。所以他清楚的列出了每一个职员的树结构。)

SQL>  select lpad(' ',4*(level-1))||ename ename,empno,mgr,level from t_emptree

  2   start with mgr<>0

  3   connect by empno=prior mgr;(or  connect by prior mgr=empno;)

 

 

b) 这个子句可以很清楚的完成整个树的从顶到底的遍历功能。(因为条件start with mgr<>0放宽限定条件,以取得多个根结点,实际就是多棵树。所以他清楚的列出了每一个职员的树结构。但是因为mgr<>0所以没有显示boss)

SQL>select lpad(' ',4*(level-1))||ename ename,empno,mgr,level from t_emptree

 start with mgr<>0

 connect by prior empno=mgr(or connect by mgr=prior empno)

 

 

 

 

Prior: PRIOR表示上一条记录,比如 CONNECT BY PRIOR empno=mgr就是说上一条记录的empno是本条记录的mgr,即本记录的父亲是上一条记录。同理CONNECT BY PRIOR mgr=empno就是说上一条纪录的mgr是本条纪录的empno,即本纪录的儿子是上一条纪录。

 

 

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

分享到:
评论

相关推荐

    oracle 基于 树结构查询

    Oracle 基于树结构查询详解 Oracle 基于树结构查询是一种高效的查询方式,特别在处理树型结构数据时。树结构查询可以快速地检索树型结构数据,并且可以根据实际需求进行查询优化。 树结构查询的基本概念: 树结构...

    Oracle递归树形结构查询功能

    例如,它可以将每个节点的路径作为字符串返回,便于理解和分析树结构。 在实际应用中,例如组织结构的展示,我们可以创建一个包含部门信息的表`SYS_DEPT`,其中`dept_id`为主键,`par_dept_id`表示父级部门ID,以此...

    Oracle查询树形结构

    Oracle 查询树形结构 Oracle 查询树形结构是一种特殊的查询方式,它可以将树形结构的数据从 Oracle 数据库中检索出来。这种结构广泛应用于各种应用系统中,例如管理系统、文件系统、组织结构等。 在 Oracle 中,...

    Oracle 数据库树形结构用法总结.mht

    Oracle 数据库树形结构用法总结,例如SYS_CONNECT_BY_PATH 、START WITH . . . CONNECT BY . . .等具体语法介绍

    Oracle树结构查询(图)

    在处理复杂的数据查询时,尤其在数据具有层次性或树状结构的情况下,Oracle提供了一种高效的方法——树结构查询。本篇文章将深入探讨Oracle如何处理这类查询,并通过一个具体的文档案例进行解析。 首先,我们要了解...

    oracle树结构查询方法

    树结构查询在Oracle中可以通过`CONNECT BY`和`START WITH`子句实现。`CONNECT BY`子句用于定义层次关系,它表明数据将按照层次顺序检索,通过指定的列(如EMPNO和MGR)连接形成树状结构。`PRIOR`关键字用于指示父...

    【原创】oracle树形结构查询,层次查询,hierarical retrival

    Oracle树形结构查询,层次查询,hierarchical retrieval Oracle中的树形结构查询,也被称为层次查询或hierarchical retrieval,是一种获取树形结构数据的方法。这种方法可以将数据组织成树形结构,具有层次关系的...

    oracle菜单树查询

    oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询

    Oracle树查询总结

    Oracle 数据库在处理树形数据结构时,提供了一...例如,对于大型树结构,可能需要考虑索引、并行查询、分区等优化手段。同时,理解这些查询如何工作,以及它们在不同情况下的表现,对于数据库设计和查询优化至关重要。

    【Oracle】树状结构查询

    在Oracle数据库中,进行树状结构查询是一种常见且强大的功能,尤其当数据具有层次或层级关系时,如组织架构、产品分类、文件系统等。本文将深入探讨如何在Oracle中执行树状结构查询,理解其背后的逻辑,以及如何利用...

    Oracle树查询实例分析

    Oracle树查询是数据库管理中处理层次结构数据的重要技术,它主要依赖于`SELECT...START WITH...CONNECT BY...PRIOR`的语法。这个语法允许我们按照树的结构来组织和检索数据,尤其适用于表示组织结构、目录层级或者...

    Oracle树查询及相关函数

    Oracle树查询是数据库管理中一种非常实用的技术,它允许我们处理具有层级关系的数据。在Oracle中,树查询主要依赖于`SELECT...START WITH...CONNECT BY...PRIOR`语法,这个语法让我们能够按照层级结构遍历数据。本文...

    oracle树查询

    ### Oracle树查询详解 在Oracle数据库中,进行树状结构数据查询时,通常会使用到特定的查询语法,包括`START WITH`、`CONNECT BY PRIOR`等关键字。本文将详细介绍这些关键字及其应用场景,并通过具体示例来帮助理解...

    oracle树结构查询.DOC

    `START WITH`子句用于指定查询的起始节点,也就是树结构中的根节点或者你想要从哪个节点开始遍历。在给定的例子中,如果我们要从ID为7839的员工(假设是经理)开始查找其下属员工,`START WITH`会这样写:`START ...

    在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现.pdf

    在数据库系统中实现树结构表递归查询是一种常见的需求,它允许我们查询出具有层级关系的数据。ORACLE、MSSQL(Microsoft SQL Server)、MYSQL是三大主流数据库系统,它们各自提供了不同的方式来实现递归查询。 首先...

    ORACLE 取树结构常用SQL

    常用取树结构方法,包括获取当前节点的层级,获取当前节点到根节点的完整树叶路径

    oracle查询成树状

    在Oracle数据库中,将查询结果转化为树状结构是一项高级而实用的技能,尤其适用于处理具有层级关系的数据,如产品分类、组织架构等。本篇将深入解析如何利用Oracle的特定功能,实现数据的树状展示。 ### 核心概念:...

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

    在本例中,"oracle树形结构"可能指的是利用Oracle数据库存储和查询树形结构数据的方法。这可能涉及到创建适当的表结构,定义父子节点关系的字段,以及编写查询语句来获取层级数据。查询可能包括查找特定节点的所有子...

    Oracle数据库体系结构( 中文详细版)

    11. **存储结构**:Oracle提供了多种存储结构,如B树索引、位图索引、反向索引等,以适应不同场景的查询需求。 12. **安全性与权限**:Oracle提供了角色、用户、权限等机制,以确保数据的安全访问。通过权限管理和...

Global site tag (gtag.js) - Google Analytics