`

转:oracle层次查询 树查询 (详细)

 
阅读更多
oracle层次查询

转自:http://www.2cto.com/database/201209/156398.html

2012-09-20      0 个评论       作者:linwaterbin
收藏    我要投稿
 
          1 定义:
 
          层次查询使用树的遍历,走遍含树形结构的数据集合,来获取树的层次关系报表的方法
          树形结构的父子关系,你可以控制:
          ① 遍历树的方向,是自上而下,还是自下而上
          ②  确定层次的开始点(root)的位置
          层次查询语句正是从这两个方面来确定的,start with确定开始点,connect by确定遍历的方向  www.2cto.com  
 
          2 语法:

 
          注释:
          ① level是伪列,表示等级
          ② from后面只能是一个表或视图,对于from是视图的,那么这个view不能包含join
          ③ Where条件限制了查询返回的行,但是不影响层次关系,属于将节点截断,但是这个被截断的节点的下层child不受影响
          ④ prior是个形容词,可放在任何地方
          ⑤ 彻底剪枝条件应放在connect by;单点剪掉条件应放在where子句。但是,connect by的优先级要高于where,也就是sql引擎先执行connect by
          ⑥ 在start with中表达式可以有子查询,但是connect by中不能有子查询
 
          3 遍历树:
 
          ㈠ Start with子句
          Start with确定将哪行作为root,如果没有start with,则每行都当作root,然后查找其后代,这不是一个真实的查询。Start with后面可以使用子查询或者任何合法的条件表达式
          例子:
[sql] 
select level,id,manager_id,last_name,title from s_emp  
      start with title=(select title from s_emp where manager_id is null)  
      connect by prior id=manager_id;  
 
          ㈡ Connect by子句
          Connect by与prior确定一个层次查询的条件和遍历的方向(prior确定)
          Connect by prior column_1=column_2;
          其中prior表示前一个节点的意思,可以在connect by等号的前后,列之前,也可以放到select中的列之前  www.2cto.com  
          Connect by也可以带多个条件,比如 connect by prior id=manager_id and id>10
 
                        1. )自顶向下遍历:
                        先由根节点,然后遍历子节点。column_1表示父key,column_2表示子key。即这种情况下:connect by prior 父key=子key表示自顶向下,等同于connect by 子key=prior 父key.
                        例子:
[sql] 
select level,employee_id,manager_id,last_name,job_id from s_emp  
      start with manager_id=100  
      connect by  employee_id=prior manager_id;  
 
                         2. )自底向上遍历:
                         先由最底层的子节点,遍历一直找到根节点。与上面的相反。Connect by之后不能有子查询,但是可以加其他条件,比如加上and id !=2等。这句话则会截断树枝,如果id=2的这个节点下面有很多子孙后代,则全部截断不显示。
                         例子:
[sql] 
select level,employee_id,manager_id,last_name,job_id from s_emp  
      start with manager_id=100    www.2cto.com  
      connect by prior employee_id=manager_id and employee_id<>120;  
 
          4 使用level和lpad格式化报表:
          Level是层次查询的一个伪列,如果有level,必须有connect by,start with可以没有
          Lpad是在一个string的左边添加一定长度的字符,并且满足中间的参数长度要求,不满足自动添加
          例子:
[sql] 
select level,employee_id,manager_id,lpad(last_name,length(last_name)+(level*4)-4,'_'),job_id from s_emp  
      start with manager_id=100  
      connect by prior employee_id=manager_id and employee_id<>120  
 
          5 修剪branches:
          where子句会将节点删除,但是其后代不会受到影响,connect by 中加上条件会将满足条件的整个树枝包括后代都删除。要注意,如果是connect by之后加条件正好条件选到根,那么结果和没有加一样
 
          6 实际应用
          1)查询每个等级上节点的数目
[sql] 
  先查看总共有几个等级:  
select count(distinct level)  
 from s_emp  
 start with manager_id is null  
 connect by prior employee_id=manager_id  
  要查看每个等级上有多少个节点,只要按等级分组,并统计节点的数目即可,可以这样写:  
select level,count(last_name)  
 from s_emp  
 start with manager_id is null  
 connect by prior employee_id=manager_id  
 group by level    www.2cto.com  
 
          2)查看等级关系
          比如给定一个具体的员工看是否对某个员工有管理权
[sql] 
select level,a.* from   
s_emp a  
where first_name='Douglas' --被管理的节点  
start with manager_id is null --开始节点,即:根节点  
connect by prior employee_id=manager_id  
 
           3)删除子树
           比如有这样的需求,现在要裁员,将某个部门的员工包括经理全部裁掉
           将id为2的员工管理的所有员工包括自己删除
[sql] 
delete from s_emp where employee_id in(  
elect employee_id from   
s_emp a  
start with employee_id=2 --从id=2的员工开始查找其子节点,把整棵树删除  
connect by prior employee_id=manager_id)  
 
           4)找出每个部门的经理
[sql] 
select level,a.* from   
 s_emp a    www.2cto.com  
 start with manager_id is null  
 connect by prior employee_id=manager_id and department_id !=prior department_id;--当前行的dept_id不等于前一行的dept_id,即每个子树中选最高等级节点  
 
           5)查询一个组织中最高的几个等级
[sql] 
select level,a.* from   
 s_emp a  
  where level <=2 –查找前两个等级  
 start with manager_id is null  
 connect by prior employee_id=manager_id and department_id !=prior department_id;  
 
       6)合计层次
          有两个需求,一是对一个指定的子树subtree做累加计算salary,一是将每行都作为root节点,然后对属于这个节点的所有子节点累加计算salary。
[sql] 
     第一种很简单,求下sum就可以了,语句:  
select sum(salary) from   
 s_emp a  
 start with id=2—比如从id=2开始  
 connect by prior id=manager_id;  
  
     第2个需求,需要用到第1个,对每个root节点求这个树的累加值,然后内部层次查询的开始节点从外层查询获得。  
select last_name,salary,(  
  select sum(salary) from   
 s_emp    www.2cto.com  
 start with id=a.id –让每个节点都成为root  
 connect by prior id=manager_id) sumsalary  
 from s_emp a;  
 
           7)找出指定层次中的叶子节点
           Leaf(叶子)就是没有子孙的孤立节点。Oracle 10g提供了一个简单的connect_by_isleaf=1,0表示非叶子节点
[sql] 
select level,id,manager_id,last_name, title from s_emp  
    where connect_by_isleaf=1 –表示查询叶子节点  
      start with  manager_id=2  
      connect by prior id=manager_id;  
 
          7 10g新特性:
 
          ① 使用SIBLINGS关键字排序
             如果使用order by排序会破坏层次,在oracle10g中,增加了siblings关键字的排序
             语法:order  siblings  by <expre>
             它会保护层次,并且在每个等级中按expre排序
             例子:
[sql] 
select level,    www.2cto.com  
       employee_id,last_name,manager_id  
       from s_emp  
       start with manager_id is null  
       connect by prior employee_id=manager_id  
       order siblings by last_name;  
 
          ② CONNECT_BY_ROOT
              Oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值
              例子:
[sql] 
select connect_by_root last_name root_last_name, connect_by_root employee_id root_id,  
      employee_id,last_name,manager_id  
      from s_emp  
      start with manager_id is null  
      connect by prior employee_id=manager_id  

 

分享到:
评论

相关推荐

    Oracle递归树形结构查询功能

    oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。这篇文章给大家介绍了Oracle递归树形结构查询功能,需要的朋友参考下

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

    oracle hierarical queries,树形结构查询部分

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

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

    oracle 层次查询

    高级sql关于层次查询更新 对于层次查询需要掌握: 1.解释层次查询的基本概念,识别需求中需要用到层次查询的能力。 2.建立和格式化一个树形报表(tree report)。 3.修剪树形结构的节点(node)和枝(branches)。

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS(Information Manage-mentSystem)是其典型代表。 2. 网状结构模型:按照网状数据结构建立的数据库系统称为网状数据库系统,其典型代表是DBTG...

    Oracle层次查询和with函数的使用示例

    开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树。这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法;...

    Oracle 10g应用指导

    在案例精讲中,对表压缩、约束的使能与失能、表的层次结构查询、防止删除表及对象、提取创建外键约束的脚本以及在线重新定义表结构的方法做了详细讲解。第6章 PL/SQL程序设计。介绍了PL/SQL中常用的函数、异常处理等...

    在Oracle 9i中Form Builder使用树心得

    Deveoper6.0以上版本提供了hierarchytree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。本文介绍了树的特有属性以及取得树节点的属性的方法。

    Oracle自学(学习)材料 (共18章 偏理论一点)

    12 管理索引 目标 12-2 索引的分类 12-3 B 树索引 12-4 位图索引 12-6 B 树索引和位图索引的比较 12-7 创建普通 B 树索引 12-8 创建索引:指导 12-10 创建位图索引 12-11 修改索引的储存参数 12-12 分配和回收索引...

    Oracle+10g应用指导与案例精讲

    在案例精讲中,对表压缩、约束的使能与失能、表的层次结构查询、防止删除表及对象、提取创建外键约束的脚本以及在线重新定义表结构的方法做了详细讲解。第6章 PL/SQL程序设计。介绍了PL/SQL中常用的函数、异常处理等...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    ORACLE重建索引总结

    4、索引高度:索引高度是指由于数据行的插入操作而产生的索引层数,当表中添加大量数据时,oracle将生成索引的新层次以适应加入的数据行,因此,oracle索引可能有4层,但是这只会出现在索引数中产生大量插入操作的...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    3.4.2 Oracle数据库中的存储层次体系 87 3.4.3 字典管理和本地管理的表空间 91 3.5 临时文件 93 3.6 控制文件 95 3.7 重做日志文件 95 3.7.1 在线重做日志 96 3.7.2 归档重做日志 98 3.8 密码文件 100 3.9 ...

    Oracle编程艺术

    3.4.2 Oracle数据库中的存储层次体系..............................................181 3.4.3 字典管理和本地管理的表空间..................................................186 3.5 临时文件..........

    精通SQL--结构化查询语言详解

    10.6 树查询 205 第11章 数据插入操作 209 11.1 插入单行记录 209 11.1.1 基本语法 209 11.1.2 整行插入 209 11.1.3 null值的插入 211 11.1.4 惟一值的插入 212 11.1.5 特定字段数据插入 213 11.1.6 通过...

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

    在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现。 但很多时候我们无法控制树的深度。这时就需要在MySQL...

    Java成绩管理系统项目案例教程

    2、具备Oracle数据库基础 3、具备JDBC编程基础 二、做这个项目的目的: 1、复习JAVA SE基础知识 2、进一步了解JDBC,了解使用JDBC对数据库操作 3、了解树形结构 4、初步了解PowerDesigner数据库建模工具的使用 5、...

Global site tag (gtag.js) - Google Analytics