- 浏览: 862581 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
connect by prior 是结构化查询中用到的,其基本语法是:
select ... from tablename start with 条件1
connect by prior 条件2
where 条件3;
例:
select * from table
start with org_id = 'AAA'
connect by prior org_id = parent_id;
简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中:
条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
条件3 是过滤条件,用于对返回的所有记录进行过滤。
简单介绍如下:
早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:
第一步:从根节点开始;
第二步:访问该节点;
第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;
第四步:若该节点为根节点,则访问完毕,否则执行第五步;
第五步:返回到该节点的父节点,并执行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
1. 树结构的描述
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。
在SELECT命令中使用CONNECT BY 和蔼START WITH 子句可以查询表中的树型结构关系。其命令格式如下:
SELECT 。。。
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}
[START WITH];
其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
START WITH: 不但可以指定一个根节点,还可以指定多个根节点。
2. 关于PRIOR
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:
CONNECT BY PRIOR EMPNO=MGR
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
CONNECT BY EMPNO=PRIOR MGR
在这种方式中也应指定一个开始的节点。
3. 定义查找起始节点
在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。
4.使用LEVEL
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。图1.2就表示了树结构的层次。
5.节点和分支的裁剪
在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。
6.排序显示
象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。
应用实例:
请教个SQL递归求和的问题:
有个一个表t,如下
NAME P_NAME NUM
a -1 3
b -1 4
c a 5
d b 6
e c 7
f d 8
g e 9
我想得到如下
NAME P_NAME NUM
a -1 24
b -1 18
其中 24=3+5+7+9
18=4+6+8
感觉需要在递归中求和,请高手指点下。
开始:
SQL> select * from t;
NAME P_NAME NUM
---------- ---------- ----------
a -1 3
b -1 4
c a 5
d b 6
e c 7
f d 8
g e 9
已选择7行。
SQL> select NAME,P_NAME,
2 (select sum(NUM) from t connect by P_NAME = prior NAME start with NAME= t0.NAME) NUM
3 from t t0
4 where P_NAME='-1';
NAME P_NAME NUM
---------- ---------- ----------
a -1 24
b -1 18
发表评论
-
在Oracle查询语句中怎样手动指定索引
2011-09-16 01:08 1172select /*+ index(tablename inde ... -
数据库范式(1NF 2NF 3NF BCNF)详解一
2011-08-28 13:35 4494数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数 ... -
数据库范式(1NF 2NF 3NF BCNF)详解二
2011-08-28 13:32 1283范式应用 我们来逐步搞定一个论坛的数据库,有如下信息: ... -
ORACLE数据库TM(表级)锁小结
2011-08-24 14:32 2175SQL语句 表锁模 ... -
Oracle中NVARCHAR2和VARCHAR2的区别
2011-05-20 10:16 2816Oracle中NVARCHAR2和VARCHAR2的区别 【 ... -
【总结】oracle恢复误删除数据,解除锁定的等sql语句
2011-03-08 16:55 1038转载请注明出处:http://renjie120.iteye. ... -
授予oracle导入用户表权限
2010-12-13 15:38 1048给用户增加导入数据权 ... -
如何写批处理文件自动将数据导入oracle数据库
2010-12-13 14:30 3249Oracle数据库的自动导入 ... -
如何使用PLSQL Developer从oracle数据库 导入导出数据
2010-12-13 14:26 4080如何使用PLSQL Developer从oracle数据库 导 ... -
oracle内存优化
2010-12-01 21:54 939内存2G的优化策略。 SGA最大大小:1300 -
让sql语句不排序,按照in语句的顺序返回结果
2010-12-01 21:47 1711oracle写法: Select * from we ... -
拯救oracle刚被误删的数据
2010-12-01 21:43 10582.误删除所有记录并且提交更改。SQL>delete f ... -
强制停止oracle正在执行的job
2010-12-01 21:40 1914一:温柔的方法:1、查看所有job;select * from ... -
oracle中connect by prior实现递归查询
2010-12-01 14:15 1116收集的几条在oracle中通过connect by prior ... -
oracle高级查询实例,提升效率
2010-12-01 13:57 921使用Oracle特有的查询语法, 可以达到事半功倍的效果。 ... -
oracle DBA必需掌握的常用命令集锦
2010-12-01 13:39 950第一章:日志管理 1.forcing log swit ... -
Oracle性能优化技巧
2010-12-01 12:21 740今天没事来说说oracle性能优化的技巧。。 1.选用适合的 ... -
alce表空间使用情况查询
2010-12-01 12:16 8291.查询oracle表空间的使用情况 select b.f ... -
几条有用sql
2010-12-01 12:14 580查找数据库中所有字段 以对应的表 select C.colu ... -
SYS_REFCURSOR一例
2010-09-29 12:25 26751.看见很多人调试过程依然使用DBMS_OUTPUT.PUT_ ...
相关推荐
oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的
select 1 from 表格 start with … connect by prior id = pId start with:表示以什么为根节点,不加限制可以写1=1,要以id为123的节点为根节点,就写为start with id =123 connect by:connect by是必须的,...
oracle中的数查询,介绍的详细,有例子。
。。。
。。。
NULL 博文链接:https://yunqiang-zhang-hotmail-com.iteye.com/blog/1312354
Oracle_start_with_connect_by_prior_用法[文].pdf
Oracle 递归查询, start with connect by prior 用法 find_in_set 函数 concat,concat_ws,group_concat 函数 MySQL 自定义函数 手动实现 MySQL 递归查询 Oracle 递归查询 在 Oracle 中是通过 start ...
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...
本文介绍Oracle中使用START WITH...CONNECT BY PRIOR子句实现递归查询树形结构的方法,小伙伴们可以参考一下。
前言 对于数据库中的树形结构数据,如...oracle实现递归查询的话,就可以使用start with … connect by connect by递归查询基本语法是: select 1 from 表格 start with … connect by prior id = pId start with
20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...
§15.4 在 PL/SQL 中使用 sqlcode,sqlerrm 273 第十六章 存储过程和函数 276 §16.1 引言 276 §16.2 存储过程 276 §16.2.1 创建过程 276 §16.2.2 使用过程 278 §16.2.3 开发存储过程步骤 279 §16.2.3.1 编辑...
需求是表里的某个字段存储的值是以逗号分隔开来的,要求根据分隔的每一个值都能查出来数据,但是不能... connect by level <= regexp_count(st_responsible, ‘,‘) + 1 and guid = prior guid and prior dbms_ra
1 性能优化 1.1 避免频繁 commit,尤其...说明:除非是单据的单号,要求必须是唯一,并且依据流水号不可以跳号,不然在大量交易的表格中,不在乎跳耗时,要取得唯一的Primary Key 建议使用Oracle Sequence这样速度会较...
connect by prior t.parentcode = t.organcode; //递归查询父节点 select t.* from g_organ t start with t.organcode = '080' connect by t.parentcode = prior t.organcode; //递归查询子节点 1.8.7 union 和 ...
criteria.add(Restrictions.sqlRestriction("MENUITEM_ID in(select a.MENUITEM_ID from Wuxin_MENUITEM a connect by prior a.MENUITEM_ID = a.PARENT_ID"+ " start with a.MENUITEM_ID = '"+parentId+"')" )); ...