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

CONNECT_BY_ROOT

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

看下面的例子,DIRINDEX分别为1、2、3的就是大分类,其他编号的都是子类或孙子类:

selectdirindex,fatherindex,RPAD('

',2*(LEVEL-1))|| dirnamefromt_tonedirlib

startwithfatherindex=0

connectbyfatherindex=priordirindex

DIRINDEXFATHERINDEX DIRNAME

---------------------

------------------------------------

10中文经典

521kkkkkkk

7052222

5852sixx

5952seven

6952uiouoooo

5552four

71流行风云

81影视金曲

11118aaa

11128bbb

11138ccc

91古典音乐

811小熊之家

10481龙珠

10581snoppy

10181叮当1

10281龙猫

10381叮当2

20热门流行

312有奖活动

322相约香格里拉

502新浪彩铃

30老歌回放

3333老电影

3353怀旧金曲

26

rows selected

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

selectCONNECT_BY_ROOT dirindex,fatherindex,RPAD('

',2*(LEVEL-1))|| dirnamefromt_tonedirlib

startwithfatherindex=0

connectbyfatherindex=priordirindex

CONNECT_BY_ROOTDIRINDEXFATHERINDEX RPAD('',2*(LEVEL-1))||DIRNAME

-----------------------

------------- -----------------------------

10中文经典

11kkkkkkk

152222

152sixx

152seven

152uiouoooo

152four

11流行风云

11影视金曲

18aaa

18bbb

18ccc

11古典音乐

11小熊之家

181龙珠

181snoppy

181叮当1

181龙猫

181叮当2

20热门流行

22有奖活动

22相约香格里拉

22新浪彩铃

30老歌回放

33老电影

33怀旧金曲

26

rows selected

查出来的结果中,CONNECT_BY_ROOTDIRINDEX就是各个子类(孙子类)所属的大类编号,如果需要统计,就只要执行以下语句马上可以统计出来了:

selectrootindex,count('X')from

(selectCONNECT_BY_ROOT dirindexasrootindex

fromt_tonedirlib

startwithfatherindex=0

connectbyfatherindex=priordirindex)a

groupbya.rootindex

ROOTINDEX

COUNT('X')

---------

----------

119

24

33

3

rows selected

CONNECT_BY_ISLEAF

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

Oracle

10G中提供了一个新特性——CONNECT_BY_ISLEAF——来解决这个问题了。简单点说,这个属性结果表明当前节点在满足条件的查询结果中是否为叶子节点,

0不是,1是:

selectCONNECT_BY_ISLEAF,dirindex,fatherindex,RPAD('

',2*(LEVEL-1))|| dirname

fromt_tonedirlib

startwithfatherindex=0

connectbyfatherindex=priordirindex

CONNECT_BY_ISLEAF DIRINDEX FATHERINDEX

RPAD('

',2*(LEVEL-1))||dirname

-----------------

---------------- ---------------------------------

010中文经典

0521kkkkkkk

17052222

15852sixx

15952seven

16952uiouoooo

15552four

171流行风云

081影视金曲

111118aaa

111128bbb

111138ccc

191古典音乐

0811小熊之家

110481龙珠

110581snoppy

110181叮当1

110281龙猫

1103 81叮当2

020热门流行

1312有奖活动

1322相约香格里拉

1502新浪彩铃

030老歌回放

13333老电影

13353怀旧金曲

26

rows selected

一看结果,清晰明了!

CONNECT_BY_ISCYCLE

我们的树状属性一般都是在一条记录中记录一个当前节点的ID和这个节点的父ID来实现。但是,一旦数据中出现了循环记录,如两个节点互为对方父节点,系统就会报ORA-01436错误:

insertintot_tonedirlib(dirindex,fatherindex,dirname,status)values(666,667,'123',5);

1

row inserted

insertintot_tonedirlib(dirindex,fatherindex,dirname,status)values(667,666,'456',5);

1 row inserted

selectdirindex,fatherindex,RPAD('

',2*(LEVEL-1))|| dirnamefromt_tonedirlib

startwithfatherindex=666

connectbyfatherindex=priordirindex

ORA-01436:用户数据中的CONNECT BY循环

10G中,可以通过加上NOCYCLE关键字避免报错。并且通过CONNECT_BY_ISCYCLE属性就知道哪些节点产生了循环:

selectCONNECT_BY_ISCYCLE,dirindex,fatherindex,RPAD('

',2*(LEVEL-1))

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9650775/viewspace-920387/,如需转载,请注明出处,否则将追究法律责任。

prior oracle 10g,Oracle 10G 新特性——增强的CONNECT BY子句相关推荐

  1. Oracle 19c和20c新特性最全解密

    本期为我们带来分享的嘉宾是 ACOUG 核心专家,Oracle ACE 总监 杨廷琨先生,本次嘉年华上,杨老师为我们带来题为:Oracle 19c 和 20c 的新特性解密 主题分享.下面,让我们跟随 ...

  2. Oracle APEX 系列文章7:Oracle APEX 18.1 新特性

    引言 千呼万唤始出来, Oracle APEX 18.1 新版本终于发布了,还不了解 Oracle APEX 是什么的同学请移步这里: Oracle APEX 系列文章1:Oracle APEX, 让 ...

  3. [小e分享]之[Oracle数据库管理艺术_11g新特性].(美)阿拉派蒂电子书(附pdf下载)

    这本书小e才看了几页比较惭愧,但对于想了解11g的同学,这本书真是很不错的 下载地址:[Oracle数据库管理艺术_11g新特性].(美)阿拉派蒂_部分1 [Oracle数据库管理艺术_11g新特性] ...

  4. C# 9 新特性 —— 增强的模式匹配

    C# 9 新特性 -- 增强的模式匹配 Intro C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧 Sample C# 9 中增强了模式匹配的用法,增加了 and/ ...

  5. C# 9 新特性 —— 增强的 foreach

    C# 9 新特性 -- 增强的 foreach Intro 在 C# 9 中增强了 foreach 的使用,使得一切对象都有 foreach 的可能 我们来看一段代码,这里我们试图遍历一个 int 类 ...

  6. 【转载】Oracle ACE总监对Oracle 12c的一些新特性总结

    2019独角兽企业重金招聘Python工程师标准>>> 本文是Oracle ACE总监Syed Jaffer Hussain对Oracle数据库12c的一些新特性总结,包括数据库管理 ...

  7. decfloat转换成oracle种类型,Oracle GoldenGate 19.1新特性

    1.GoldenGate 19.1 新特性概览 a.支持Oracle数据库19.1 长期支持发布版本.集成Oracle GoldenGate 12.3版的最终补丁集更新. b.微服务的安全性和可管理性 ...

  8. 无路可逃:Oracle 12.2 BigSCN新特性可能的DB Link兼容性问题

    在<云和恩墨技术通讯>的3月刊中,我们再次强调了关于 SCN 问题的预警,提醒大家在2019年6月23日之前采取必要的措施. 下载链接: https://cs.enmotech.com/d ...

  9. 基于权重的节点驱逐 - Oracle RAC 12.2 新特性

    在 Oracle RAC 中,多个节点之间需要能够正常通信来保持集群的一致性.当一个节点发生故障或者发生脑裂,节点因网络等原因不能与其他节点互通时,很可能会在集群重新配置的过程中被驱逐出去. RAC ...

  10. 【ORACLE】21版本新特性之SQL宏(SQL MACROS)的分析

    前言 在21c发布后,很多文章中都提到了SQL宏,但看到的人们大多都有个疑问,这个SQL宏看上去和一般的函数没什么区别,为什么还要重点拿出来说? 我们先看看ORACLE官方是怎么说的 https:// ...

最新文章

  1. HDU1576 A/B (解法二)【试探法】
  2. leetcode 106. 从中序与后序遍历序列构造二叉树 c语言递归解法
  3. 112. 雷达设备【贪心】
  4. 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试
  5. 大数据-----软件开发模型(详细讲解)
  6. 2d 蓝图_“蓝图”卷积--对深度可分离卷积的再思考
  7. ITK在vs2010下安装、搭建
  8. 携程中转机票竟然相差23小时
  9. android 海康云眸SDK简单使用
  10. python爬取哔哩哔哩视频_python爬取哔哩哔哩小视频
  11. 组态王报警历史存MySQL_组态王6.55报警存储与历史数据查询设置全过程
  12. 服务器打不QQ显示00001,QQ登陆不了显示00001,什么意思
  13. 关于MOSFET驱动电阻的选择
  14. 苹果MacBook Pro usb连接iPhone反复重连解决方法
  15. 部署harbor服务器(https/http)
  16. 使用datadog来监控os和postgresql数据库
  17. 适用于Android智能手机的6大数据保护应用
  18. 【顺序表】顺序表定位
  19. 618来了还愁没钱买东西?五分钟教你如何白嫖!
  20. Docker安装Elasticsearch及安装中文分词插件

热门文章

  1. ELK(数据批量导入、查询)
  2. 扶贫资金用计算机审计,【方法】精准扶贫资金的审计方法
  3. mysql获取上条的id_mybatis批量update,返回行数为-1
  4. elasticsearch对身份证号码的处理(ngarm分词或者pipeline)
  5. Google I/O 2022 新鲜出炉,打开你技术的想象空间
  6. 十二届蓝桥杯青少年Python组省赛试题
  7. 频率学派(Frequentists) 、贝叶斯学派(Bayesians)
  8. 本科生毕业论文(设计)免费赠送项目完整源码,可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案等
  9. 筋斗云教程(二): 系统分析与设计
  10. 什么是LMS算法(Least mean square)