来源:  http://blog.csdn.net/itmyhome1990/article/details/16338637
 
ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型 结构的联系。
 例如有如下案例:

数据为节选,字段值含义分别为税务机构代码、税务机构名称、上级税务机构代码,税务机构级别
select * from extern_dm_swjg查询的时候默认顺序就是上面的顺序,可以看出是混乱的并没有特殊结构特征。

而希望的结果如下图:


sj_swjg_dm为空即根节点的排在第一个,仔细观察 上图是树结构查询结果,可能不太直观,看下图就清楚了


1. 树结构的描述 
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,
通过每个节点的父节点,就可以确定整个树结构。
在SELECT命令中使用CONNECT BY和START WITH 子句可以查询表中的树型结构关系。其命令格式如下:
SELECT ... 
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2} 
[START WITH]... 
其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在的一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上
START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

例1 以树结构方式显示表的数据。
  1. select swjg_dm,swjg_mc,sj_swjg_dm,swjg_level
  2. from extern_dm_swjg
  3. connect by prior swjg_dm = sj_swjg_dm
  4. start with sj_swjg_dm is null
2. 关于PRIOR 
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。

例2从节点开始自底向上查询
  1. select swjg_dm,swjg_mc,sj_swjg_dm,swjg_level
  2. from extern_dm_swjg
  3. connect by  swjg_dm =  prior sj_swjg_dm
  4. start with swjg_dm = '16107100004'
3.使用LEVEL 
    在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 
    在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。
 
例3 显示表中的各行数据及层号。
  1. select level, swjg_dm,swjg_mc,sj_swjg_dm,swjg_level
  2. from extern_dm_swjg
  3. connect by prior swjg_dm = sj_swjg_dm
  4. start with sj_swjg_dm is null

伪列LEVEL为数值型,可以在SELECT 命令中用于各种计算。

例4 使用LEVEL改变查询结果的显示形式。

  1. select LPAD(LEVEL,LEVEL*3,' ') as "LEVEL", swjg_dm,swjg_mc,sj_swjg_dm,swjg_level
  2. from extern_dm_swjg
  3. connect by prior swjg_dm = sj_swjg_dm
  4. start with sj_swjg_dm is null
在SELECT使用了函数LPAD,关于LPAD函数的使用,请参阅Oracal的Lpad函数
4.节点和分支的裁剪 
    在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

例5  仅剪去了树中单个节点16107100003 扶风县国家税务局
  1. select LPAD(LEVEL,LEVEL*3,' ') as "LEVEL", swjg_dm,swjg_mc,sj_swjg_dm,swjg_level
  2. from extern_dm_swjg
  3. where swjg_dm !='16107100003'
  4. connect by prior swjg_dm = sj_swjg_dm
  5. start with sj_swjg_dm is null

 在这个查询中,仅剪去了树中单个节点swjg_dm为16107100003的,可它的子节点依然存在。若希望剪去树结构中的某个分支,
 则要用CONNECT BY 子句。CONNECT BY 子句是限定树型结构中的整个分支,既要剪除分支上的单个节点,
 也要剪除其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

例6  除去节点16107100003的一支
  1. select LPAD(LEVEL,LEVEL*3,' ') as "LEVEL", swjg_dm,swjg_mc,sj_swjg_dm,swjg_level
  2. from extern_dm_swjg
  3. connect by prior swjg_dm = sj_swjg_dm
  4. and swjg_dm !='16107100003'
  5. start with sj_swjg_dm is null

    这个查询结果就与例5不同,除了剪去单个节点 16107100003 外,还将 16107100003 的子节点16107100004剪掉,即把 16107100003  这个分支剪掉了。 
    当然WHERE子句可以和CONNECT BY子句联合使用,这样能够同时剪掉单个节点和树中的某个分支。
 
在使用SELECT 语句来报告树结构报表时应当注意,CONNECT BY子句不能作用于出现在WHERE子句中的表连接。如果需要进行连接,可以先用树结构建立一个视图,再将这个视图与其他表连接,以完成所需要的查询。

oracle分层查询中的start with和connect by(树结构查询)的更多相关文章

  1. 【杂记】mysql 左右连接查询中的NULL的数据筛选问题,查询NULL设置默认值,DATE_FORMAT函数

    MySQL左右连接查询中的NULL的数据筛选问题 xpression 为 Null,则 IsNull 将返回 True:否则 IsNull 将返回 False. 如果 expression 由多个变量 ...

  2. 编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代

    建议31:在LINQ查询中避免不必要的迭代 无论是SQL查询还是LINQ查询,搜索到结果立刻返回总比搜索完所有的结果再将结果返回的效率要高. 示例代码: class MyList : IEnumera ...

  3. 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>

    建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:E ...

  4. Oracle 树操作、递归查询(select…start with…connect by…prior)

    一.Oracle中start with…connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是:select … from tablename start ...

  5. Oracle中 “ORA-14551: 无法在查询中执行 DML 操作” 如何解决

    在编写一个数据库函数时,方法实现需要查询后进行修改,出现ora-14551的错误 create or replace function fun_DxcBillSn(tabType integer,ta ...

  6. Oracle子查询中any、some、all之间的区别

    用some,any和all对子查询中返回的多行结果进行处理. 下面我们来简单介一下这几个关键词的含义. * Some在此表示满足其中一个的意义,是用or串起来的比较从句. * Any也表示满足其中一个 ...

  7. oracle 子查询中null的问题(in 和 not in)

    这里的in后面的句子可以理解为or拼接,简单举例即 in (9566,9839,null)可以等价于mgr=9566 or mgr=9839 or mgr=null, not in (9566,983 ...

  8. oracle 查询中实现分页

    那么Oracle如何实现分页呢?--Oracle分页查询SELECT   * FROM   (     SELECT         ROWNUM R,YANGCQ_ID,YANGCQ_BRANCHI ...

  9. Oracle系列——开发中奇葩问题你遇到几个(一)

    前言:在使用oracle数据进行开发的时候有没有经常出现一些很奇怪.很纳闷.很无厘头的问题呢.下面是本人使用oracle一段时间遇到的问题小节,在此做个记录,方便以后再遇到类似的问题能快速解决.如果你 ...

随机推荐

  1. android-View视图的根基类

  2. android-时间选择器和日期选择器

    一.实现动态输入日期和时间 * DataPicker(日历选择器) * DataPicker对象以init()方法指定DatePicker初始的年月日及OnDateChangedListener事件 ...

  3. 关于html页面布局

    之前做的一个网站,结果今天这几天测试发现在19寸屏幕和手机屏幕上页面布局全乱了,今天刚刚改好,发现还是自己经验不足,做个小总结. 一.div布局要固定宽高 当div不设计长宽高而是自动由内部控件”撑“ ...

  4. c# winform进入窗口后在文本框里的默认焦点

    c# winform 设置winform进入窗口后在文本框里的默认焦点   进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这 ...

  5. c#语句 类

    知识点: 1.string类 2.Math类 3.DateTime  获取时间 for穷举 1.羽毛球拍15元,球3元,水2元.现有200元,每种至少买一个,共有多少种可能.

  6. Oracle TDE的数据加密示例并用logminer验证加密效果

    1.确认数据库版本 2创建密钥钱包 3创建加密列的表并初始值 4演示TDE的数据加密示例 5 logminer验证加密效果

  7. 【iCore3 双核心板】例程六:IWDG看门狗实验——复位ARM

    实验指导书及代码包下载: http://pan.baidu.com/s/1c0frjHm iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  8. vba 工作案例-sheet间拷贝内容

    核心代码就是Copy Destination. Sub copy_data() ' ' copy_data 宏 ' ' Dim fzjgs() As Variant Dim cities As Var ...

  9. Rotate List || LeetCode

    /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * } ...

  10. 用apktool工具进行apk的编译和反编译

    1.apktool下载安装 给一个2.0版的csdn地址:http://download.csdn.net/download/txj8612/7408775 下载后无需安装,直接解压缩,得到三个文件: ...