`

Oracle 10G -- 增强的CONNECT BY子句

阅读更多

http://hi.baidu.com/heerit/blog/item/1f0235d99dcc022e11df9b91.html

 

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

CONNECT_BY_ISCYCLE

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

  • 如果有这样的数据
    insert into t_tonedirlib(dirindex, fatherindex, dirname, status) values (666, 667, '123', 5);
    insert into t_tonedirlib(dirindex, fatherindex, dirname, status) values (667, 666, '456', 5);
  • 执行这样的查询
    select dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname from t_tonedirlib
    start with fatherindex = 666
    connect by   fatherindex =   prior dirindex;
  • 结果是 ORA-01436: 用户数据中的 CONNECT BY 循环。
10G中,可以通过加上NOCYCLE关键字避免报错。并且通过CONNECT_BY_ISCYCLE属性就知道哪些节点产生了循环
select CONNECT_BY_ISCYCLE, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname
from t_tonedirlib
start with fatherindex = 666
connect by NOCYCLE fatherindex =   prior dirindex
CONNECT_BY_ISCYCLE DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname
;

----------------- ---------------- ---------------------------------
                  0                    667                    666 456
                  1                    666                    667 123
2 rows selected

CONNECT_BY_ISLEAF

查找树状表中的叶子节点不是件容易事。可以给表增加了一个字段来描述这个节点是否为叶子节点来解决问题,但这样做有很大的弊端:需要通代码逻辑来保证这个字段的正确性。
Oracle 10G中提供了一个新特性 CONNECT_BY_ISLEAF 来解决这个问题。简单点说,这个属性结果表明当前节点在满足条件的查询结果中是否为叶子节点, 0不是,1是。

select CONNECT_BY_ISLEAF, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname   
from t_tonedirlib
start with fatherindex = 0
connect by   fatherindex =   prior dirindex
CONNECT_BY_ISLEAF DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname
  • 查询结果清晰明了!
    ----------------- ---------------- ---------------------------------
                     0                      1                      0 中文经典           
                     0                     52                      1    kkkkkkk          
                     1                     70                     52      222            
                     1                     58                     52      sixx           
                     1                     59                     52      seven          
                     1                     69                     52      uiouoooo       
                     1                     55                     52      four           
                     1                      7                      1    流行风云         
                     0                      8                      1    影视金曲         
                     1                   1111                      8      aaa            
                     1                   1112                      8      bbb            
                     1                   1113                      8      ccc            
                     1                      9                      1    古典音乐         
                     0                     81                      1    小熊之家         
                     1                    104                     81      龙珠           
                     1                    105                     81      snoppy         
                     1                    101                     81      叮当1          
                     1                    102                     81      龙猫           
                     1                    103                     81      叮当2          
                     0                      2                      0 热门流行           
                     1                     31                      2    有奖活动         
                     1                     32                      2    相约香格里拉     
                     1                     50                      2    新浪彩铃         
                     0                      3                      0 老歌回放           
                     1                    333                      3    老电影           
                     1                    335                      3    怀旧金曲         
    
分享到:
评论

相关推荐

    oracle中connect-by-prior用法,实战解决日期分解问题.docx

    Oracle数据库中的`CONNECT BY PRIOR`是一个强大的查询构造器,用于处理树形数据结构,尤其在组织层级、部门结构或者员工管理系统中非常常见。这个功能允许我们从一个或多个根节点开始,按照指定的规则遍历整个树结构...

    oracle10g常用命令数据库的备份和恢复

    ### Oracle 10g 常用命令:数据库的备份与恢复 #### 一、基础知识与环境准备 在深入探讨 Oracle 10g 数据库的备份与恢复之前,我们需要了解一些基本概念和环境配置。 ##### 1. 连接到 Oracle 10g 数据库 - **连接...

    Oracle start with.connect by prior子句实现递归查询

    ### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...

    oracle中connect-by-prior用法,实战解决日期分解问题.pdf

    Oracle数据库中的`connect by prior`是一个强大的SQL查询构造,用于处理具有层级关系的数据,常见于组织结构、部门层级、时间序列分析等场景。这个特性允许我们遍历和查询树形结构,将层次数据平展为一行一列的形式...

    ORACLE查询树型关系(connect_by_prior_start_with)

    在 Oracle 10g 中,引入了新的伪列函数 CONNECT_BY_ROOT、CONNECT_BY_ISLEAF 和 CONNECT_BY_ISCYCLE,以增强层次查询的能力。 CONNECT_BY_ROOT 函数可以用来获取当前行的根节点,例如: ```sql SELECT CONNECT_BY_...

    oracle-tree-sql.rar_oracle

    Oracle的Connect By子句是处理层次数据的核心工具。它允许我们指定一个层级关系的起始点,并按照指定的规则递归地遍历整个树。基本语法如下: ```sql SELECT column_list FROM table_name START WITH condition ...

    精通oracle 10g plsql 编程-学习笔记

    ### 精通Oracle 10g PL/SQL编程学习笔记 #### 一、PL/SQL综述 **1.1 PL/SQL的功能与作用** PL/SQL (Procedural Language for SQL) 是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据处理能力与过程化...

    oracle connect by level 应用

    Oracle的`CONNECT BY LEVEL`是数据库查询中用于构建层次结构数据的一种强大工具,尤其是在处理具有层级关系的数据时,如组织架构、产品分类等。本文将深入探讨`CONNECT BY`子句以及`LEVEL`伪列的使用,以帮助你更好...

    树状数据库表:Oracle中start with...connect by prior子句用法

    总结来说,`START WITH...CONNECT BY PRIOR`子句是Oracle SQL处理树形数据的关键工具,通过它可以有效地查询和展示层次关系的数据。理解并熟练运用这个子句,能够帮助你在处理具有层级结构的业务场景时更加游刃有余...

    Oracle_start_with_connect_by_prior_用法

    ### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...

    关于创建oracle 连接时报以下错误,ORA-01017 ORA-02063

    文档中提到,出现这些错误的上下文是在尝试从Oracle 10g R2建立到Oracle 11g R1的新数据库连接时。在Oracle 11g版本中,默认情况下用户密码是区分大小写的,这与早期版本如Oracle 10g中的默认设置不同。当从低版本...

    Oracle 10g中的高级SQL函数

    `GROUP BY` 和 `HAVING` 子句是SQL中的基础工具,但在Oracle 10g中,你可以使用 `CUBE()`, `ROLLUP()`, `GROUPING SETS()` 进行多维度分析,创建更复杂的分组。`CONNECT BY` 用于构建层次结构,如组织结构或产品分类...

    connect_by_prior_递归算法

    在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式遍历树形结构的数据集。 #### 二、Connect By Prior 的基本语法 `Connect By Prior`...

    connect by的使用

    在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...

    浅谈Oracle下connect by原理.pdf

    在Oracle中,Connect By子句是专门用于处理层级数据查询的工具,尤其适用于管理树状结构或具有父子关系的数据。本文将探讨Oracle中的Connect By原理,并结合实例详细解释其工作方式及相关的语法和功能。 1. Connect...

    connect by的使用探索

    其中,`START WITH`子句用于指定查询的起始节点,`CONNECT BY`子句用于指定查询的递归条件。 Connect By的执行原理 Connect By语句的执行原理可以用以下程序来说明: ```sql for rec in (select * from some_table...

    oracle connect by 和 分析函数总结.doc

    Oracle的`CONNECT BY`和分析函数是数据库查询中的两种强大工具,主要用于处理复杂的数据结构和进行高级数据分析。本文将深入探讨这两种技术。 ### Oracle `CONNECT BY` 用法总结 `CONNECT BY` 是Oracle SQL中用于...

    Oracle,MS-SQL server命名规范和语法整理.txt

    - **MSSQL与Oracle**:基本语法一致,但Oracle提供了更丰富的功能,如`WITH`子句用于定义子查询,以及`CONNECT BY`和`START WITH`用于层次查询。 综上所述,无论是命名规范还是具体的语法特性,Oracle与MS SQL ...

    Oracle数据库学习日记-实用性最强的Oracle学习总结.docx

    ### Oracle数据库学习知识点详解 #### 一、基本使用 ##### 1.1 常用命令 **1.1.1 Connect/Disconnect数据库连接命令** - **用途:** 连接或断开与Oracle数据库的连接。 - **语法示例:** - `sqlplus username/...

Global site tag (gtag.js) - Google Analytics