- 浏览: 1064330 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
在SELECT命令中使用CONNECT BY 和START WITH 子句可以查询表中的树形结构关系。其命令格式如下:
SELECT ….. CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}
[START WITH];
其中:CONNECT BY子句说明每行资料将是按层次顺序检索,并规定将表中的资料连入树形结构的关系中。
0PRIORY运算符必须放置在连接关系的两列中的某一个的前面。对于节点间的父子关系,PRIOR去处符在一侧表示父节点,
在别一侧表示子节点,从而确定查找权结构的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,
还允许使用列运算式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。
例子:
create table test2(empno number,ename varchar2(30),managerid number);
insert into test2 values(10000,'martin',0);
insert into test2 values(10001,'binn',10000);
insert into test2 values(10002,'davit',10001);
insert into test2 values(10003,'kyte',10002);
insert into test2 values(10004,'shre',10003);
insert into test2 values(10006,'ivan',10002);
insert into test2 values(10007,'richard',10003);
select empno,ename,managerid,level,sys_connect_by_path(empno||ename,'<-') router
from test2
start with ename='martin'
--connect by empno=prior managerid
connect by prior empno=managerid
order by level desc;
select empno,ename,managerid,level,sys_connect_by_path(empno||ename,'->') router
from test2
start with ename='richard'
connect by empno=prior managerid
order by level desc;
总结:
所以,上述规则可以描述为:
01) 当操作符prior在parent前面时,得到child =>parent关系树
当prior在child前面时,得到parent =>child关系树
02) 当指定了start with时,过滤掉没有包含指定字段的所有关系;否则,不作任何过滤,显示所有关系
最简单实际使用小例子:
在有些项目中,下拉中用数据源取年份时,可用如下方式写:
select * from
(select rownum,to_char(add_months(sysdate, 4), 'yyyy') - rownum
from dual connect by rownum<5);
注意:用此函数多表关联出现问题与ORACLE版本有关,例子如下:
create or replace view VIEW_T1 as
/*
* 816不支持这种写法,9201下这种写法,在以Fld3为条件做查询时会导致记录数不正确
SELECT *
FROM T1 A, TCODE B
WHERE A.Fld1 = B.Fld1(+)
AND A.Fld3 = B.C_DM(+)
START WITH Fld2 IS NULL
CONNECT BY PRIOR Fld2_Farther= Fld2
*/
SELECT A.*, nvl(B.C_MC, A.Fld3) Fld3_MC from
(
SELECT *
FROM T1 A
START WITH Fld2 IS NULL
CONNECT BY PRIOR Fld2_Farther= Fld2
) A, TCODE B
WHERE A.Fld1 = B.Fld1(+)
AND A.Fld3 = B.C_DM(+)
=================================================================================
有关层次查询之前的文章参考如下。
【层次查询】Hierarchical Queries之LEVEL应用
http://space.itpub.net/519536/viewspace-623916
【层次查询】Hierarchical Queries之“树的遍历”
http://space.itpub.net/519536/viewspace-623809
【层次查询】Hierarchical Queries之CONNECT_BY_ISCYCLE伪列
http://space.itpub.net/519536/viewspace-624032
继LEVEL和CONNECT_BY_ISCYCLE伪列之后,最后一个可用的伪列名字叫做CONNECT_BY_ISLEAF,正如这个伪列名字中描述的那样,他可以指示出哪些是“叶子节点”,就是这么简单。
如果发现是叶子节点,该伪列会返回“1”,反之返回记录“0”。
1.回望那棵关系“树”,很直观,F、G和E节点是叶子节点。
A
/ \
B C
/ /
D E
/ \
F G
2.重温一下阐述上图的T表数据
sec@ora10g> select * from t;
X Y Z
---------- ---------- ----------
A 1
B 2 1
C 3 1
D 4 2
E 5 3
F 6 4
G 7 4
7 rows selected.
3.结合LEVEL伪列看一下CONNECT_BY_ISLEAF的直观效果
sec@ora10g> col tree for a16
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF from t start with x = 'A' connect by NOCYCLE prior y=z;
TREE CONNECT_BY_ISLEAF
---------------- -----------------
A 0
B 0
D 0
F 1
G 1
C 0
E 1
7 rows selected.
是不是有一种豁然开朗的感觉,对头,CONNECT_BY_ISLEAF功能就是这么简单。
4.如何仅筛选出上面结果中所有叶子节点?
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z;
TREE CONNECT_BY_ISLEAF
---------------- -----------------
F 1
G 1
E 1
5.得到每一层级叶子节点
可以理解下面的SQL是对“树”的逐层消除的过程。
1)不做消除,因为我们的树只有4层。
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=4;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
F 1 4
G 1 4
E 1 3
(2)对应的“树”
A
/ \
B C
/ /
D E
/ \
F G
2)消除第四层
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=3;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
D 1 3
E 1 3
(2)对应的“树”
A
/ \
B C
/ /
D E
3)消除第三层
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=2;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
B 1 2
C 1 2
(2)对应的“树”
A
/ \
B C
4)消除第二层
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=1;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
A 1 1
(2)对应的“树”,此时只剩根节点了。
A
6.小结
有关层次查询中可用的伪列有LEVEL、CONNECT_BY_ISCYCLE还是本文所述的CONNECT_BY_ISLEAF伪列,这些伪列都是从可用性角度提出来的。稍作组合便可以得到意想不到的效果。更多有趣的细节请大家慢慢体会。
SELECT ….. CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}
[START WITH];
其中:CONNECT BY子句说明每行资料将是按层次顺序检索,并规定将表中的资料连入树形结构的关系中。
0PRIORY运算符必须放置在连接关系的两列中的某一个的前面。对于节点间的父子关系,PRIOR去处符在一侧表示父节点,
在别一侧表示子节点,从而确定查找权结构的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,
还允许使用列运算式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。
例子:
create table test2(empno number,ename varchar2(30),managerid number);
insert into test2 values(10000,'martin',0);
insert into test2 values(10001,'binn',10000);
insert into test2 values(10002,'davit',10001);
insert into test2 values(10003,'kyte',10002);
insert into test2 values(10004,'shre',10003);
insert into test2 values(10006,'ivan',10002);
insert into test2 values(10007,'richard',10003);
select empno,ename,managerid,level,sys_connect_by_path(empno||ename,'<-') router
from test2
start with ename='martin'
--connect by empno=prior managerid
connect by prior empno=managerid
order by level desc;
select empno,ename,managerid,level,sys_connect_by_path(empno||ename,'->') router
from test2
start with ename='richard'
connect by empno=prior managerid
order by level desc;
总结:
所以,上述规则可以描述为:
01) 当操作符prior在parent前面时,得到child =>parent关系树
当prior在child前面时,得到parent =>child关系树
02) 当指定了start with时,过滤掉没有包含指定字段的所有关系;否则,不作任何过滤,显示所有关系
最简单实际使用小例子:
在有些项目中,下拉中用数据源取年份时,可用如下方式写:
select * from
(select rownum,to_char(add_months(sysdate, 4), 'yyyy') - rownum
from dual connect by rownum<5);
注意:用此函数多表关联出现问题与ORACLE版本有关,例子如下:
create or replace view VIEW_T1 as
/*
* 816不支持这种写法,9201下这种写法,在以Fld3为条件做查询时会导致记录数不正确
SELECT *
FROM T1 A, TCODE B
WHERE A.Fld1 = B.Fld1(+)
AND A.Fld3 = B.C_DM(+)
START WITH Fld2 IS NULL
CONNECT BY PRIOR Fld2_Farther= Fld2
*/
SELECT A.*, nvl(B.C_MC, A.Fld3) Fld3_MC from
(
SELECT *
FROM T1 A
START WITH Fld2 IS NULL
CONNECT BY PRIOR Fld2_Farther= Fld2
) A, TCODE B
WHERE A.Fld1 = B.Fld1(+)
AND A.Fld3 = B.C_DM(+)
=================================================================================
有关层次查询之前的文章参考如下。
【层次查询】Hierarchical Queries之LEVEL应用
http://space.itpub.net/519536/viewspace-623916
【层次查询】Hierarchical Queries之“树的遍历”
http://space.itpub.net/519536/viewspace-623809
【层次查询】Hierarchical Queries之CONNECT_BY_ISCYCLE伪列
http://space.itpub.net/519536/viewspace-624032
继LEVEL和CONNECT_BY_ISCYCLE伪列之后,最后一个可用的伪列名字叫做CONNECT_BY_ISLEAF,正如这个伪列名字中描述的那样,他可以指示出哪些是“叶子节点”,就是这么简单。
如果发现是叶子节点,该伪列会返回“1”,反之返回记录“0”。
1.回望那棵关系“树”,很直观,F、G和E节点是叶子节点。
A
/ \
B C
/ /
D E
/ \
F G
2.重温一下阐述上图的T表数据
sec@ora10g> select * from t;
X Y Z
---------- ---------- ----------
A 1
B 2 1
C 3 1
D 4 2
E 5 3
F 6 4
G 7 4
7 rows selected.
3.结合LEVEL伪列看一下CONNECT_BY_ISLEAF的直观效果
sec@ora10g> col tree for a16
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF from t start with x = 'A' connect by NOCYCLE prior y=z;
TREE CONNECT_BY_ISLEAF
---------------- -----------------
A 0
B 0
D 0
F 1
G 1
C 0
E 1
7 rows selected.
是不是有一种豁然开朗的感觉,对头,CONNECT_BY_ISLEAF功能就是这么简单。
4.如何仅筛选出上面结果中所有叶子节点?
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z;
TREE CONNECT_BY_ISLEAF
---------------- -----------------
F 1
G 1
E 1
5.得到每一层级叶子节点
可以理解下面的SQL是对“树”的逐层消除的过程。
1)不做消除,因为我们的树只有4层。
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=4;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
F 1 4
G 1 4
E 1 3
(2)对应的“树”
A
/ \
B C
/ /
D E
/ \
F G
2)消除第四层
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=3;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
D 1 3
E 1 3
(2)对应的“树”
A
/ \
B C
/ /
D E
3)消除第三层
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=2;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
B 1 2
C 1 2
(2)对应的“树”
A
/ \
B C
4)消除第二层
(1)SQL
sec@ora10g> select lpad(' ',2*(level-1))||x tree, CONNECT_BY_ISLEAF, LEVEL from t where CONNECT_BY_ISLEAF=1 start with x = 'A' connect by NOCYCLE prior y=z and level<=1;
TREE CONNECT_BY_ISLEAF LEVEL
---------------- ----------------- ----------
A 1 1
(2)对应的“树”,此时只剩根节点了。
A
6.小结
有关层次查询中可用的伪列有LEVEL、CONNECT_BY_ISCYCLE还是本文所述的CONNECT_BY_ISLEAF伪列,这些伪列都是从可用性角度提出来的。稍作组合便可以得到意想不到的效果。更多有趣的细节请大家慢慢体会。
发表评论
-
Oracle强制使用索引
2013-01-25 16:48 5378Oracle强制使用索引: select /*+ INDEX ... -
Oracle if exists(...)
2013-01-22 10:52 1304对于Oracle中没有 if exists(...) 的语法, ... -
oracle 赋debug权限
2013-01-15 15:29 4115pl/sql 报错 不能运行debug 时 ora-0131 ... -
Oracle 10g使用游标更新或删除数据
2013-01-04 16:03 1125在定义又表示必须要带 ... -
树-Oracle用Start with...Connect By子句递归查询
2013-01-04 14:59 1071Start with...Connect By子句递归查询一般 ... -
java.sql.SQLException: ORA-01436: 用户数据中的 CONNECT BY 循环
2013-01-04 14:55 2439SELECT r1.region_id,parent_id ... -
Oracle创建删除用户、角色、表空间、导入导出、...命令总结
2013-01-03 16:24 1309//创建临时表空间 create temporary ta ... -
ResultSet.getMetaData() 的使用
2012-08-12 11:22 2148java.sql.ResultSet.getMetaData( ... -
ORACLE中如何查找特定对象中的文本内容~
2012-04-30 19:37 1284[c-sharp] view plaincopy SQL> ... -
Oracle 下读取表/字段的备注信息
2012-04-30 19:19 1230Oracle 通过COMMENT ON TABLE / C ... -
nls_sort和nlssort 排序功能介绍
2012-04-23 23:20 11201ALTER SESSION SET NLS_SORT=''; ... -
Oracle 递归查询 树查询 start with connect by prior
2012-02-28 09:52 1130网页地址: http://www.iteye.com/topi ... -
java中oracle特殊字符的查询
2011-10-18 14:38 2426escape:指定某字符为特殊字符: 例如指定‘\’ 为特殊字 ... -
Oracle中的 单引号 和 双引号
2011-10-18 09:17 1321双引号的作用是:假如建立对象的时候,对象名、字段名加双引号,则 ... -
pl/sql case or decode
2011-10-16 00:19 1136SELECT CASE 3 WHEN 1 THEN ... -
Oracle存储过程返回游标 [转载]
2012-04-22 22:09 4678有俩种方法: 一种是声明系统游标,一种是声明自定义游标,然后 ... -
oracle索引表函数(集合函数)(下表为字符串的索引表举例红色)(嵌套表/索引表/可变数组举例绿色)
2011-10-12 11:40 0一、EXISTS函数 1、检测 ... -
pl/sql 集合代码 的遍历方式
2011-10-12 10:22 1523-- Created on 2011-10-12 by HUC ... -
浅谈oracle复合数据类型
2012-04-22 22:10 1020--本文档可以直接拷贝运行。 /* oracle复合数 ... -
table array object record
2012-04-22 22:10 1168前段时间我恰好有关于这些的学习笔记,贴出来大家指点一下: ...
相关推荐
### Oracle数据库中的START WITH 和 CONNECT BY 用法详解 在Oracle数据库中,处理层次结构数据时,`START WITH` 和 `CONNECT BY` 是非常有用的两个关键字。这些关键字可以帮助我们在查询时构建出树形或者层级结构的...
Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 ...
### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...
本文章详细介绍了Oracle中connect by...start with...的用法。
通常,`CONNECT BY`与`START WITH`一起使用,`START WITH`指定了层级遍历的起始节点。 例如,假设我们有一个员工表(EMPLOYEE),其中包含上级员工ID(MANAGER_ID)字段,我们可以使用以下查询来展示员工的管理层次...
在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们构建出树形结构的结果集,这对于分析组织架构、产品分类、文件系统等具有...
Oracle数据库通过提供`START WITH...CONNECT BY`语句来简化这类查询操作。此功能最早出现在Oracle 8.1.6版本,并一直沿用至今,成为处理递归查询的强大工具之一。 #### 二、Connect By与Start With详解 1. **...
总结来说,`START WITH...CONNECT BY PRIOR`子句是Oracle SQL处理树形数据的关键工具,通过它可以有效地查询和展示层次关系的数据。理解并熟练运用这个子句,能够帮助你在处理具有层级结构的业务场景时更加游刃有余...
connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制 prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,...
Oracle 连接查询是指使用 START WITH 和 CONNECT BY 语句来实现递归查询的方法,这种方法可以生成树形结构的数据。在 Oracle 中,START WITH 语句用于指定递归查询的开始记录,而 CONNECT BY 语句用于指定递归查询的...
[ WHERE condition ][ [ START WITH condition ] CONNECT BY condition [ ORDER SIBLINGS BY expression ] ] ``` 其中,`START WITH`子句用于指定查询的起始节点,`CONNECT BY`子句用于指定查询的递归条件。 ...
Oracle的`CONNECT BY`和分析函数是数据库查询中的两种强大工具,主要用于处理复杂的数据结构和进行高级数据分析。本文将深入探讨这两种技术。 ### Oracle `CONNECT BY` 用法总结 `CONNECT BY` 是Oracle SQL中用于...
在SQL查询中,`START WITH` 和 `CONNECT BY` 是两个关键的子句,它们用于构建层次结构查询,通常在处理具有上下级关系的数据时非常有用,如员工与经理的关系、组织结构或者产品分类等。这两个子句是Oracle数据库特有...
在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...
Oracle是甲骨文公司的一款关系型...使用Connect By进行查询时,需要特别注意循环关系的处理,以及正确地使用`START WITH`、`CONNECT BY`子句和相关伪列。掌握这些知识点,对于Oracle数据库开发人员来说是必不可少的。
### Oracle中的Connect By Prior递归算法详解 ...通过正确地设置`START WITH`、`CONNECT BY`和`WHERE`子句,可以有效地查询和分析复杂的数据结构。理解其工作原理有助于更好地利用Oracle的功能来满足各种业务需求。
递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的层级查询,以展示数据的层次关系。 在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START ...
总的来说,`CONNECT BY PRIOR`是Oracle SQL中处理树形数据结构的强大工具,它能够帮助我们有效地查询和呈现层级关系,广泛应用于组织架构、产品分类、供应链管理等各种场景。正确理解和使用这个功能,可以极大地提升...
在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...