- 浏览: 615949 次
- 性别:
- 来自: 杭州,长沙
文章分类
- 全部博客 (279)
- Java (30)
- Jsp、Servlet (18)
- Web前端 (56)
- Oracle (31)
- SqlServer (1)
- Jetty (3)
- Tomcat (6)
- Weblogic (11)
- Websphere (2)
- Struts2 (13)
- Spring (5)
- Ibatis (8)
- Hibernate (3)
- Webservice (1)
- C/C++ (2)
- Linux (13)
- Android (1)
- 正则表达式 (3)
- 网络组建 (3)
- 软件工程 (11)
- IDE使用技巧 (20)
- Windows操作技巧 (18)
- 养生之道 (1)
- 杂七杂八 (15)
- 心理保健 (1)
最新评论
-
50854319:
elements[i] = tagArr[i]; 这个需要修改 ...
document.getElementsByName在IE下的bug解决 -
mengsina:
通过楼主的介绍,能够启动client了。但是又遇到了cisco ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
zzz_robinson:
谢谢,关闭-启动-启动。这个循序对的,否则每次都提示服务没打开 ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
wuchunjiesp:
总算解决了,THANK楼主,空值问题是TYPE里面参数类型定义 ...
(原创)Ibatis2调用数据库存储过程的相关示例 -
wuchunjiesp:
存储里面是这样的
FOR I IN 1..P_GOODSDI ...
(原创)Ibatis2调用数据库存储过程的相关示例
1.如何正确排序: siblings
2.展现路径: SYS_CONNECT_BY_PATH
3.条件的执行顺序
先准备一下测试用的数据:
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进行排序:
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和查询结果如下:
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和结果如下:
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分页查询语句
2010-04-27 17:42 0Oracle的分页查询语句基 ... -
sqldeveloper2.1启动报无法创建jvm实例错误的解决方法
2010-02-25 13:48 1677SQL Developer 启动时报错: Un ... -
提供大家一个pl/sql developer 8 完全破解补丁(不是loader.exe)
2009-11-10 18:01 9916本人亲自下载测试,完全可用,完美破解,支持目前官方提供的最新版 ... -
Oracle:查找表的主键,外键,唯一性约束,索引
2009-11-04 14:26 30171、查找表的所有索引(包括索引名,类型,构成列): sele ... -
如何启动或关闭数据库的归档(ARCHIVELOG)模式
2009-11-03 13:52 1382Oracle数据库可以运行在2种模式下:归档模式(archiv ... -
oralce存储过程输入数据java List示例
2009-08-03 17:48 3299一:java代码: 1,Bean pub ... -
oracle创建表空间,创建用户
2009-07-22 17:28 1291//创建临时表空间 create temporary tabl ... -
Oracle动态游标入门
2009-07-13 10:14 2612一、最简单的一个动态游标:CREATE OR REPLACE ... -
用java调用oracle存储过程
2009-07-10 11:11 806一:无返回值的存储过程 存储过程为: CREATE OR ... -
oracle job详解
2009-07-07 16:17 2130一、设置初始化参数 job ... -
存储过程中使用dblink,碰到dblink死锁解决方案
2009-07-06 18:03 2527CREATE OR REPLACE PROCEDURE syn ... -
Oracle预定义的21个系统异常类型!
2009-07-06 17:07 1152命名的系统异常 产生原因 ... -
oracle游标使用
2009-07-03 19:07 1392游标: 用来查询数据库,获取记录集合(结果集)的指针,可 ... -
oracle存储过程,游标及循环应用实例
2009-07-03 18:13 7621最近在项目中做了一个关于系统与系统之间数据同步的业务,之前使用 ... -
如何让你的SQL运行得更快
2009-07-01 16:40 771人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否 ... -
用一个实例讲解Oracle的自定义聚集函数
2009-07-01 16:29 1077Oracle数据库的定制功能十分强大。Oracle不但允许用 ... -
对一大表建立索引时应当注意的事项及提高性能
2009-07-01 16:22 1159一、注意事项: 首先,应当考虑表空间和磁盘空间是否足够。我们 ... -
Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数)
2009-07-01 11:42 911SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十 ... -
利用oracle快照dblink解决数据库表同步问题
2009-06-30 19:42 1795--名词说明:源——被 ... -
oracle db_link 和触发器实现不同数据库表的同步
2009-06-30 19:35 2178---创建dblink,dblink_test名称,(被同步数 ...
相关推荐
### Oracle 递归查询详解及实例 #### 一、引言 在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于...
本文将深入探讨Oracle数据库中的递归查询,包括其基本语法、工作原理以及几个实用的例子。 #### 一、递归查询概述 递归查询允许我们在SQL语句中执行多次相同的操作,直到满足某个终止条件为止。这种查询特别适合...
除了递归查询之外,文章还提到了以下几个知识点: ##### 3. `FIND_IN_SET`函数 - **用途**: 查找字符串在一个字符串列表中的位置。 - **语法**: ```sql FIND_IN_SET(str,strlist) ``` - **示例**: ```sql ...
递归WITH子查询的基本结构包括以下几个部分: 1. **子查询名称**:`query_name`,需要列出所有列名,这与内联视图类似,但可以在整个查询中多次引用。 2. **子查询定义**:`AS (subquery)`,这里的`subquery`包含了...
在给定的标题“oracle 使用递归的性能提示测试对比”和描述中,主要讨论了使用`START WITH...CONNECT BY NOCYCLE PRIOR`语句进行递归查询时的两种不同实现方式,以及它们对性能的影响。 首先,我们来理解这两种不同...
- NEXT_DAY:找到给定日期后的下一个特定星期几。 - TO_CHAR/TO_DATE:将日期时间转换为字符串或将字符串转换为日期时间。 4. **转换函数** - TO_NUMBER:将字符串转换为数值。 - TO_CHAR:将数值、日期或其他...
* 递归查询:在Oracle中,使用START WITH...CONNECT BY来实现递归查询,而在Postgresql中,使用WITH RECURSIVE来实现递归查询。 * UPDATE语句别名:在Postgresql中,UPDATE语句的SET字段不能有别名,而在Oracle中,...
在进行Oracle到SQL Server的迁移过程中,需要特别关注上述几个方面。尽管这两种数据库系统在许多方面具有相似性,但也存在显著差异。了解这些差异并采取适当的转换策略对于确保迁移成功至关重要。通过遵循上述指导...
读者可以学习到以下几个方面的技巧: 掌握Oracle数据库中独有的SQL强大特征; 读取并理解SQL执行计划; 快速分析并改进表现欠佳的SQL; 通过提示及配置文件等来控制执行计划; 在程序中优化查询而无需改动...
D17090GC10_ppt可能代表的是Oracle数据库的基础课程,通常会包括以下几个方面: 1. **Oracle数据库介绍**:讲解Oracle数据库的起源、发展历程和在企业中的应用,以及其在数据存储、处理和管理中的核心地位。 2. **...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. 获取当前月份的开始日期与结束...以上是对给定文档中几个主要知识点的总结与解释,希望能帮助你更好地理解和掌握这些Oracle SQL语句的使用方法。
本资源"SQL精典问题与语句"涵盖了几个关键的SQL技术,对于存储过程的开发者来说尤其有价值。以下将详细介绍这些知识点: 1. **SQL递归语句**: 递归查询在处理层次结构数据时非常常见,例如组织架构、产品分类等。...
- **子查询**:掌握在查询语句中嵌套使用查询的能力,以解决复杂的查询需求,包括单行子查询和多行子查询的应用技巧。 - **高级查询**:深入探讨复杂查询技巧,如使用WITH子句进行递归查询、窗口函数的应用、复杂...
Oracle提供了几种处理层级数据的方法,包括自连接、递归子查询、CONNECT BY语句以及层次查询。本资料重点介绍的是使用存储过程来实现层次数据的汇总。 在Oracle中,存储过程是一种预编译的SQL和PL/SQL代码集合,...
当迁移 Oracle 的数据操作语言(DML)语句和过程化语言(如 PL/SQL)到 SQL Server 时,需要考虑以下几个关键的区别: 1. **DML 语句的语法验证**: Oracle 和 SQL Server 的 SELECT、INSERT、UPDATE 和 DELETE ...
通过巧妙地组合Oracle内置的伪列、函数和递归查询方法,我们可以高效地生成大量结构化的测试数据,这对于优化数据库性能、进行数据建模和测试有着重要的作用。掌握了这一技能,无论是对于日常的数据库管理工作还是...
以下将根据提供的内容,详细解析Oracle中的几个关键知识点。 一、锁定与编辑表 在PL/SQL环境下,如果你想对查询结果进行编辑,可以使用`ROWID`或`FOR UPDATE`子句。`ROWID`允许你在不锁定表的情况下查看和编辑数据...
- 递归查询首先处理起始行(`START WITH`或根节点),然后逐步向下扩展到子节点(`CONNECT BY`)。 - 需要注意设置适当的停止条件,避免无限递归。 **其他说明:** - 运行递归查询时可能会遇到性能问题,特别是当递归...
在Oracle期末考试复习中,以下几个核心知识点是必须掌握的: 一、用户管理 1. 登录:使用`Connect`命令切换用户,注意结束时不需要分号。了解`Quota`,它是分配给用户的磁盘空间限制。 2. 密码管理:`password ...
在将 Oracle 数据库中的数据操作语言(DML)语句和过程化语言(PL/SQL)程序迁移至 SQL Server 时,需要考虑以下几个关键点: 1. **DML 语句的语法验证**: - 对于 SELECT、INSERT、UPDATE 和 DELETE 语句,首先要...