`
sbpya
  • 浏览: 610015 次
  • 性别: Icon_minigender_1
  • 来自: 杭州,长沙
社区版块
存档分类
最新评论

oracle子递归查询语句的几个有用的属性

阅读更多

1.如何正确排序:  siblings 
       2.展现路径:  SYS_CONNECT_BY_PATH
       3.条件的执行顺序



  先准备一下测试用的数据:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> SELECT FUNC_ID, SUPER_ID, NAME
    
FROM MGR_PURV_FUNCTION
 START 
WITH FUNC_ID = 5
CONNECT 
BY PRIOR FUNC_ID = SUPER_ID
FUNC_ID SUPER_ID NAME ORDER_ID
1 0 根配置 0
11 1 配置1 21
111 11 具体配置1 6
112 11 具体配置2 5
14 112 具体配置分支1 3
115 112 具体配置分支2 7
116 11 具体配置3 8
117 116 具体配置分支3 9
12 1 配置2 1
128 12 具体配置11 10
123 12 具体配置12 14

    下面偶来讲具体内容:
  1.正确排序:  siblings 
             我们通常使用order by进行排序:            

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> SELECT FUNC_ID, SUPER_ID, NAME,ORDER_ID
    
FROM tmp_test2
 START 
WITH FUNC_ID = 1
CONNECT 
BY PRIOR FUNC_ID = SUPER_ID
order by order_id;

            但是这得到的结果是不正确的,因为order by在oracle的sql执行引擎中是最后被执行,其结果如下:

FUNC_ID SUPER_ID NAME ORDER_ID
1 0 根配置 0
12 1 配置2 1
14 112 具体配置分支1 3
112 11 具体配置2 5
111 11 具体配置1 6
115 112 具体配置分支2 7
116 11 具体配置3 8
117 116 具体配置分支3 9
128 12 具体配置11 10
123 12 具体配置12 14
11 1 配置1 21

            要得到正确的结果集,需要引入siblings,其在oracle的sql执行引擎的递归过程中发挥作用,因此结果正确,使用sql和查询结果如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> SELECT FUNC_ID, SUPER_ID, NAME,ORDER_ID
2    FROM tmp_test2
3 START WITH FUNC_ID = 1
4CONNECT BY PRIOR FUNC_ID = SUPER_ID
5order siblings by order_id;
FUNC_ID SUPER_ID NAME ORDER_ID
1 0 根配置 0
12 1 配置2 1
128 12 具体配置11 10
123 12 具体配置12 14
11 1 配置1 21
112 11 具体配置2 5
14 112 具体配置分支1 3
115 112 具体配置分支2 7
111 11 具体配置1 6
116 11 具体配置3 8
117 116 具体配置分支3 9

       2.展现路径:  SYS_CONNECT_BY_PATH
             有时候我们需要通过sql来直接展示节点的层次结构,一般的做法是通过伪列level和lpad来构造分割符来构造树的视觉效果,结果类似以下列表:

根配置
  配置2
    具体配置11
    具体配置12
  配置1
    具体配置2
      具体配置分支1
      具体配置分支2
    具体配置1
    具体配置3
      具体配置分支3

            其实oracle提供了原生的方法支持此类需求,而且效果更好,那就是函数sys_connect_by_path,使用sql和结果如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT FUNC_ID, SUPER_ID, NAME, ORDER_ID, SUBSTR(SYS_CONNECT_BY_PATH(NAME, '->'), 3) REMARK
    
FROM TMP_TEST2
 START 
WITH FUNC_ID = 1
CONNECT 
BY PRIOR FUNC_ID = SUPER_ID
 
ORDER SIBLINGS BY ORDER_ID;

 

FUNC_ID

SUPER_ID

NAME

ORDER_ID

remark

1 0 根配置 0 根配置
12 1 配置2 1 根配置->配置2
128 12 具体配置11 10 根配置->配置2->具体配置11
123 12 具体配置12 14 根配置->配置2->具体配置12
11 1 配置1 21 根配置->配置1
112 11 具体配置2 5 根配置->配置1->具体配置2
14 112 具体配置分支1 3 根配置->配置1->具体配置2->具体配置分支1
115 112 具体配置分支2 7 根配置->配置1->具体配置2->具体配置分支2
111 11 具体配置1 6 根配置->配置1->具体配置1
116 11 具体配置3 8 根配置->配置1->具体配置3
117 116 具体配置分支3 9 根配置->配置1->具体配置3->具体配置分支3

 

 


            这点其实在“递归查询遍历详解”已经提及了,但是有兄弟经常会搞错
            首先是要注意子句的语法书写顺序:select -> from -> where -> start with -> connect by -> order by
            where写在connect by后面就不行,报错。

 

 

            其次要注意子句的执行顺序:from -> start with -> connect by -> where -> select -> order by
            执行顺序where在connect by之后,因此如果需要过滤出数据在进行递归查询,一定要将放到一个子查询结果中才行

           4、level

例子 create table tmp_test
(id number,
name varchar2(20),
pid number);

插入一些数据 ,如
1 A 0
2 B 1
3 C 2
4 D 3
5 E 3
6 F 4
7 G 5
8 H 1

select a.*,level from tmp_test a
start with id=1
connect by prior id=pid ;
执行结果
ID NAME PID LEVEL
1 A 0 1
2 B 1 2
3 C 2 3
4 D 3 4
6 F 4 5
5 E 3 4
7 G 5 5
8 H 1 2

分享到:
评论

相关推荐

    oracle递归查询的例子

    ### Oracle 递归查询详解及实例 #### 一、引言 在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于...

    SQL语句 递归

    本文将深入探讨Oracle数据库中的递归查询,包括其基本语法、工作原理以及几个实用的例子。 #### 一、递归查询概述 递归查询允许我们在SQL语句中执行多次相同的操作,直到满足某个终止条件为止。这种查询特别适合...

    MySQL多种递归查询方法.docx

    除了递归查询之外,文章还提到了以下几个知识点: ##### 3. `FIND_IN_SET`函数 - **用途**: 查找字符串在一个字符串列表中的位置。 - **语法**: ```sql FIND_IN_SET(str,strlist) ``` - **示例**: ```sql ...

    Oracle 11GR2的递归WITH子查询方法

    递归WITH子查询的基本结构包括以下几个部分: 1. **子查询名称**:`query_name`,需要列出所有列名,这与内联视图类似,但可以在整个查询中多次引用。 2. **子查询定义**:`AS (subquery)`,这里的`subquery`包含了...

    oracle 使用递归的性能提示测试对比

    在给定的标题“oracle 使用递归的性能提示测试对比”和描述中,主要讨论了使用`START WITH...CONNECT BY NOCYCLE PRIOR`语句进行递归查询时的两种不同实现方式,以及它们对性能的影响。 首先,我们来理解这两种不同...

    Oracle内建函数大全

    - NEXT_DAY:找到给定日期后的下一个特定星期几。 - TO_CHAR/TO_DATE:将日期时间转换为字符串或将字符串转换为日期时间。 4. **转换函数** - TO_NUMBER:将字符串转换为数值。 - TO_CHAR:将数值、日期或其他...

    Oracle迁移到PG建议.docx

    * 递归查询:在Oracle中,使用START WITH...CONNECT BY来实现递归查询,而在Postgresql中,使用WITH RECURSIVE来实现递归查询。 * UPDATE语句别名:在Postgresql中,UPDATE语句的SET字段不能有别名,而在Oracle中,...

    ORACLE和SQL Server的语法区别

    在进行Oracle到SQL Server的迁移过程中,需要特别关注上述几个方面。尽管这两种数据库系统在许多方面具有相似性,但也存在显著差异。了解这些差异并采取适当的转换策略对于确保迁移成功至关重要。通过遵循上述指导...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    读者可以学习到以下几个方面的技巧:  掌握Oracle数据库中独有的SQL强大特征;  读取并理解SQL执行计划;  快速分析并改进表现欠佳的SQL;  通过提示及配置文件等来控制执行计划;  在程序中优化查询而无需改动...

    oracle 官方培训教程

    D17090GC10_ppt可能代表的是Oracle数据库的基础课程,通常会包括以下几个方面: 1. **Oracle数据库介绍**:讲解Oracle数据库的起源、发展历程和在企业中的应用,以及其在数据存储、处理和管理中的核心地位。 2. **...

    Oracle+SQL精妙SQL语句讲解.txt

    根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. 获取当前月份的开始日期与结束...以上是对给定文档中几个主要知识点的总结与解释,希望能帮助你更好地理解和掌握这些Oracle SQL语句的使用方法。

    SQL精典问题与语句

    本资源"SQL精典问题与语句"涵盖了几个关键的SQL技术,对于存储过程的开发者来说尤其有价值。以下将详细介绍这些知识点: 1. **SQL递归语句**: 递归查询在处理层次结构数据时非常常见,例如组织架构、产品分类等。...

    oracle层次汇总存储过程

    Oracle提供了几种处理层级数据的方法,包括自连接、递归子查询、CONNECT BY语句以及层次查询。本资料重点介绍的是使用存储过程来实现层次数据的汇总。 在Oracle中,存储过程是一种预编译的SQL和PL/SQL代码集合,...

    oracle和SQL的语法区别

    当迁移 Oracle 的数据操作语言(DML)语句和过程化语言(如 PL/SQL)到 SQL Server 时,需要考虑以下几个关键的区别: 1. **DML 语句的语法验证**: Oracle 和 SQL Server 的 SELECT、INSERT、UPDATE 和 DELETE ...

    Oracle中如何用一条SQL快速生成10万条测试数据

    通过巧妙地组合Oracle内置的伪列、函数和递归查询方法,我们可以高效地生成大量结构化的测试数据,这对于优化数据库性能、进行数据建模和测试有着重要的作用。掌握了这一技能,无论是对于日常的数据库管理工作还是...

    oracle学习笔记

    以下将根据提供的内容,详细解析Oracle中的几个关键知识点。 一、锁定与编辑表 在PL/SQL环境下,如果你想对查询结果进行编辑,可以使用`ROWID`或`FOR UPDATE`子句。`ROWID`允许你在不锁定表的情况下查看和编辑数据...

    Oracle期末考试复习资料1

    在Oracle期末考试复习中,以下几个核心知识点是必须掌握的: 一、用户管理 1. 登录:使用`Connect`命令切换用户,注意结束时不需要分号。了解`Quota`,它是分配给用户的磁盘空间限制。 2. 密码管理:`password ...

    Oracle和SQL_Server的语法区别

    在将 Oracle 数据库中的数据操作语言(DML)语句和过程化语言(PL/SQL)程序迁移至 SQL Server 时,需要考虑以下几个关键点: 1. **DML 语句的语法验证**: - 对于 SELECT、INSERT、UPDATE 和 DELETE 语句,首先要...

    图书:Oracle SQL入门

    此外,Oracle提供了一些高级特性,如物质化视图、分区表、物化 join、递归查询等,这些在处理大数据或复杂查询时尤其有用。 《Apress.Beginning.Oracle.SQL.Dec.2009.pdf》这本书可能涵盖了以上所有内容,并且会...

Global site tag (gtag.js) - Google Analytics