知识大全 Oracle10g新特性—增强的CONNECTBY子句

Posted

篇首语:家资是何物,积帙列梁梠。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle10g新特性—增强的CONNECTBY子句相关的知识,希望对你有一定的参考价值。

Oracle10g新特性—增强的CONNECTBY子句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  为了更好的查询一个树状结构的表 在Oracle的PL/SQL中提供乐一个诱人的特性——CONNECT BY子句 它大大的方便了我们查找树状表 遍历一棵树 寻找某个分支…… 但还是存在一些不足 在Oracle G 就对这个特性做了增强 下面就举例说明一下

  CONNECT_BY_ROOT

  一张表 有多颗子树(根节点为 ) 现在我想知道每个节点属于哪个子树 举例 铃音目录结构下有多个大分类 中外名曲 流行经典 浪漫舞曲…… 每个大类下面又有多个子类 子类下面还可以细分 那现在想要知道每个子类分属哪个大类 或者要统计每个大类下面有多少个子类

  看下面的例子 DIRINDEX分别为 的就是大分类 其他编号的都是子类或孙子类

  select dirindex fatherindex RPAD( *(LEVEL )) || dirname from t_tonedirlib        start with fatherindex =         connect by fatherindex = prior dirindex        DIRINDEX FATHERINDEX DIRNAME       

   中文经典        kkkkkkk                sixx        seven        uiouoooo        four        流行风云        影视金曲        aaa        bbb        ccc        古典音乐        小熊之家        龙珠        snoppy        叮当         龙猫        叮当         热门流行        有奖活动        相约香格里拉        新浪彩铃        老歌回放        老电影        怀旧金曲        rows selected

  如何统计 三个大类下有哪些子类 有多少个子类?在 i及以前要做这样的统计十分麻烦 现在 G提供了一个新特性 CONNECT_BY_ROOT 他的作用就是使结果不是当前的节点ID 而满足查询条件下的根节点的ID 以上面为例 我们需要得到以上结果只需要执行以下语句就可以搞定了

  select CONNECT_BY_ROOT dirindex fatherindex RPAD( *(LEVEL )) || dirname from t_tonedirlib        start with fatherindex =         connect by fatherindex = prior dirindex        CONNECT_BY_ROOTDIRINDEX FATHERINDEX RPAD( *(LEVEL ))||DIRNAME       

   中文经典        kkkkkkk                sixx        seven        uiouoooo        four        流行风云        影视金曲        aaa        bbb        ccc        古典音乐        小熊之家        龙珠        snoppy        叮当         龙猫        叮当         热门流行        有奖活动        相约香格里拉        新浪彩铃        老歌回放        老电影        怀旧金曲        rows selected

  查出来的结果中 CONNECT_BY_ROOTDIRINDEX就是各个子类(孙子类)所属的大类编号 如果需要统计 就只要执行以下语句马上可以统计出来了          select rootindex count( X ) from        (select CONNECT_BY_ROOT dirindex as rootindex        from t_tonedirlib        start with fatherindex =         connect by fatherindex = prior dirindex) a        group by a rootindex        ROOTINDEX COUNT( X )                                        rows selected        CONNECT_BY_ISLEAF

  经常有DBA因为要查找树状表中的叶子节点而苦恼 大部分DBA为了解决这个问题就给表增加了一个字段来描述这个节点是否为叶子节点 但这样做有很大的弊端 需要通代码逻辑来保证这个字段的正确性

  Oracle G中提供了一个新特性——CONNECT_BY_ISLEAF——来解决这个问题了 简单点说 这个属性结果表明当前节点在满足条件的查询结果中是否为叶子节点 不是 是          select CONNECT_BY_ISLEAF dirindex fatherindex RPAD( *(LEVEL )) || dirname        from t_tonedirlib        start with fatherindex =         connect by fatherindex = prior dirindex        CONNECT_BY_ISLEAF DIRINDEX FATHERINDEX RPAD( *(LEVEL ))||dirname                中文经典        kkkkkkk                sixx        seven        uiouoooo        four        流行风云        影视金曲        aaa        bbb        ccc        古典音乐        小熊之家        龙珠        snoppy        叮当         龙猫        叮当         热门流行        有奖活动        相约香格里拉        新浪彩铃        老歌回放        老电影        怀旧金曲        rows selected

  一看结果 清晰明了!

  CONNECT_BY_ISCYCLE

  我们的树状属性一般都是在一条记录中记录一个当前节点的ID和这个节点的父ID来实现 但是 一旦数据中出现了循环记录 如两个节点互为对方父节点 系统就会报ORA 错误          insert into t_tonedirlib(dirindex fatherindex dirname status) values ( );        row inserted        insert into t_tonedirlib(dirindex fatherindex dirname status) values ( );        row inserted        select dirindex fatherindex RPAD( *(LEVEL )) || dirname from t_tonedirlib        start with fatherindex =         connect by fatherindex = prior dirindex        ORA : 用户数据中的 CONNECT BY 循环

   G中 可以通过加上NOCYCLE关键字避免报错 并且通过CONNECT_BY_ISCYCLE属性就知道哪些节点产生了循环          select CONNECT_BY_ISCYCLE dirindex fatherindex RPAD( *(LEVEL )) || dirname        from t_tonedirlib        start with fatherindex =         connect by NOCYCLE fatherindex = prior dirindex        CONNECT_BY_ISCYCLE DIRINDEX FATHERINDEX RPAD( *(LEVEL ))||dirname                                rows selected

cha138/Article/program/Oracle/201311/18952

相关参考

知识大全 Oracle10g新特性—选择性编译

Oracle10g新特性—选择性编译  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle

知识大全 Oracle10g最佳20个新特性

Oracle10g最佳20个新特性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!答案依DBA的工作

知识大全 Oracle10g新特性——选择性编译

Oracle10g新特性——选择性编译  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracl

知识大全 oracle 10g 新特性中文笔记一

  第一章安装    目标    完成本课您将能够:    *列出新的安装特性  *列出安装性能的增加    安装新特性支持    *数据库存储选项  文件系统  自动存储管理(asm)  裸设备  

知识大全 使用Oracle10g提供的flashback drop新特性

使用Oracle10g提供的flashbackdrop新特性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 oracle10g新特性—物化视图

  Advisor       在g将查询重写并且引进了新的强大的调优建议者使管理物化视图变得容易多了  物化视图(Materia

知识大全 在Oracle10g和9i上一些新的特性的总结

在Oracle10g和9i上一些新的特性的总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!内部P

知识大全 10g树形查询新特性

  在g中Oracle提供了新的伪列CONNECT_BY_ISCYCLE通过这个伪列可以判断是否在树形查询的过程中构成了循环这个伪列只是在CONNECTBYNOCYCLE方式下有效  这一篇描述一下解

知识大全 详解Oracle10g中MERGE功能的增强

详解Oracle10g中MERGE功能的增强  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Or

知识大全 将Oracle10g内置的安全特性用于PHP

将Oracle10g内置的安全特性用于PHP  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当今