转载自:http://hi.baidu.com/ljmybfq/item/f9d48a1651ce560dd1d66d45
层次查询子句connect by,用于构造层次结果集的查询。
语法:
[ START WITH condition ]
CONNECT BY [ NOCYCLE ] condition
说明:
a、START WITH:告诉系统以哪个节点作为根结点开始查找并构造结果集,该节点即为返回记录中的最高节点。
b、当分层查询中存在上下层互为父子节点的情况时,会返回ORA-01436错误。此时,需要在connect by后面加上NOCYCLE关键字。同时,可用connect_by_iscycle伪列定位出存在互为父子循环的具体节点。connect_by_iscycle必须要跟关键字NOCYCLE结合起来使用,用法见示例2。
用法举例:
示例1:显示所有地名关系结构。
SQL> select * from t;
AREA_ID AREA_NAME MGR_ID
-------- ---------- ------
86 中国
01 北京 86
02 福建 86
0101 海淀区 01
0102 朝阳区 01
0103 东城区 01
0104 西城区 01
0201 厦门 02
0202 福州 02
020101 湖里 0201
020102 思明 0201
010401 复兴门 0104
010402 西单 0104
已选择13行。
SQL>
SQL> set pagesize 50
SQL> col AreaName for a12
SQL> col Root for a10
SQL> col Path for a24
SQL>
SQL> select rpad( ' ', 2*(level-1), ' ' ) || area_name "AreaName",
2 connect_by_root area_name "Root",
3 connect_by_isleaf "IsLeaf",
4 level ,
5 SYS_CONNECT_BY_PATH(area_name, '/') "Path"
6 from t
7 start with mgr_id is null
8 connect by prior area_id = mgr_id;
AreaName Root IsLeaf LEVEL Path
------------ ---------- ------ ---------- ------------------------
中国 中国 0 1 /中国
北京 中国 0 2 /中国/北京
海淀区 中国 1 3 /中国/北京/海淀区
朝阳区 中国 1 3 /中国/北京/朝阳区
东城区 中国 1 3 /中国/北京/东城区
西城区 中国 0 3 /中国/北京/西城区
复兴门 中国 1 4 /中国/北京/西城区/复兴门
西单 中国 1 4 /中国/北京/西城区/西单
福建 中国 0 2 /中国/福建
厦门 中国 0 3 /中国/福建/厦门
湖里 中国 1 4 /中国/福建/厦门/湖里
思明 中国 1 4 /中国/福建/厦门/思明
福州 中国 1 3 /中国/福建/福州
已选择13行。
说明:
a、prior:是单一操作符,放在列名的前面,等号左右均可; 放在父 ID 就是 寻找 祖先节点 ,放到本身 ID就是寻找 子节点 ;
b、connect_by_root:是单一操作符,返回当前层的最顶层节点;
c、connect_by_isleaf:是伪列,判断当前层是否为叶子节点,1代表是,0代表否;
d、level:是伪列,显示当前节点层所处的层数;
e、SYS_CONNECT_BY_PATH:是函数,显示当前层的详细路径。
示例2:找出人事部门中存在跟其他部门互为管理者的人员名单。
SQL> select * from t2;
EMP DEPT MGR
------------ ------ ----------
刘涛 总裁办
李飞 总裁办 刘涛
张强 总裁办 刘涛
王鹏 人事 李飞
李华 人事 李飞
张强 人事 李飞
李飞 行政 张强
吴华 行政 张强
已选择8行。
SQL>
SQL> col emp for a12
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp"
2 from t2
3 start with dept ='人事'
4 connect by prior emp = mgr;
ERROR:
ORA-01436: 用户数据中的 CONNECT BY 循环
未选定行
说明:张强和李飞互为管理者,因此,要用nocycle,如下所示:
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp"
2 from t2
3 start with dept ='人事'
4 connect by nocycle prior emp = mgr;
emp
------------
王鹏
李华
张强
李飞
王鹏
李华
吴华
已选择7行。
SQL>
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp",
2 connect_by_iscycle "IsCycle"
3 from t2
4 start with dept ='人事'
5 connect by prior emp = mgr;
connect by prior emp = mgr
*
第 5 行出现错误:
ORA-30930: CONNECT_BY_ISCYCLE 伪列要求 NOCYCLE 关键字
说明:在用connect_by_iscycle定位节点时,也要用nocycle关键字,如下所示:
SQL>
SQL> select rpad( ' ', 2*(level-1), ' ' ) || emp "emp",
2 connect_by_iscycle "IsCycle"
3 from t2
4 start with dept ='人事'
5 connect by nocycle prior emp = mgr;emp IsCycle
------------ -------
王鹏 0
李华 0
张强 0
李飞 1
王鹏 0
李华 0
吴华 0
已选择7行。
SQL>
示例3:仅显示第二层(即level=2)省市名称。
SQL> select rpad( ' ', 2*(level-1), ' ' ) || area_name "AreaName"
2 from t
3 where level = 2
4 start with mgr_id is null
5 connect by prior area_id = mgr_id;
AreaName
------------
北京
福建
示例4:用connect by构造序列。
SQL>
SQL> select rownum rn
2 from dual
3 connect by rownum<=10;
RN
----------
1
2
3
4
5
6
7
8
9
10
已选择10行。
SQL> select rownum*2 -1 rn
2 from dual
3 connect by rownum<=10;
RN
----------
1
3
5
7
9
11
13
15
17
19
已选择10行。
-----------------------------------------
附:建表语句
create table t (area_id varchar2(6), area_name varchar2(10), mgr_id varchar2(6));
insert into t values('86', '中国', null);
insert into t values('01', '北京', '86');
insert into t values('02', '福建', '86');
insert into t values('0101', '海淀区', '01');
insert into t values('0102', '朝阳区', '01');
insert into t values('0103', '东城区', '01');
insert into t values('0104', '西城区', '01');
insert into t values('0201', '厦门', '02');
insert into t values('0202', '福州', '02');
insert into t values('020101', '湖里', '0201');
insert into t values('020102', '思明', '0201');
insert into t values('010401', '复兴门', '0104');
insert into t values('010402', '西单', '0104');
commit;
create table t2 (emp varchar2(10), dept varchar2(6), mgr varchar2(10));
insert into t2 values('刘涛', '总裁办', null);
insert into t2 values('李飞', '总裁办', '刘涛');
insert into t2 values('张强', '总裁办', '刘涛');
insert into t2 values('王鹏', '人事', '李飞');
insert into t2 values('李华', '人事', '李飞');
insert into t2 values('张强', '人事', '李飞');
insert into t2 values('李飞', '行政', '张强');
insert into t2 values('吴华', '行政', '张强');
commit;
相关推荐
### Oracle的Connect By使用示例 #### 一、引言 在关系数据库系统中,进行树状或层次结构数据查询时经常会遇到复杂性问题。Oracle数据库通过提供`START WITH...CONNECT BY`语句来简化这类查询操作。此功能最早出现...
在这个例子中,`SYS_CONNECT_BY_PATH`函数用斜杠(/)分隔了路径中的每一个员工名。 需要注意的是,`CONNECT BY`可能会导致循环引用或无限循环,如果数据存在环状引用(员工A的上级是员工B,而员工B的上级又回到了...
文章中给出了一个名为`t_test_connectby`的数据表例子,其中包含父子关系的节点数据。通过该表,我们可以更直观地了解Connect By的执行过程。 - 不指定起始条件时,使用`CONNECT BY`: ```sql SELECT * FROM t_test...
### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...
本文将详细介绍如何利用 `Connect By Prior` 来构建和查询层次结构数据,并通过具体的例子来解释其工作原理。 #### 核心知识点详解 ### 1. `Connect By Prior` 的基本语法与含义 `Connect By Prior` 是一个用于...
本文将通过一个具体的例子来详细介绍如何在 Oracle 中实现递归查询。 #### 二、基础知识回顾 在深入讨论之前,我们需要先了解几个基础概念: 1. **START WITH 子句**:用于指定递归查询的起始条件。 2. **CONNECT ...
CONNECT TO username IDENTIFIED BY password USING 'network_protocol'; ``` 其中: - `db_link_name`:定义DBLink的名称。 - `username` 和 `password`:用于连接远程数据库的用户名和密码。 - `network_protocol`...
Oracle的`sys_connect_by_path`函数是一个非常有用的工具,尤其在构建树状结构的数据时。在本文中,我们将深入理解这个函数以及如何将其应用于非树结构的数据以生成所需的结果。 `sys_connect_by_path`函数的基本...
在例子中,`CONNECT BY PRIOR employee_id = manager_id` 表示当前行的`employee_id`等于前一行的`manager_id`,这样就建立了员工与其直接上级之间的连接。这个过程会持续进行,直到所有符合规则的层级都被遍历。 `...
Oracle提供了一种称为“连接查询”(Connect By)的特有语法,使得我们可以方便地对具有层级关系的数据进行检索。本资料"oracle-tree-sql.rar_oracle"主要探讨的就是如何在Oracle中使用SQL查询树形结构数据。 一、...
在例子中,`CONNECT BY prior child = parent`表示如果当前行的`child`字段等于前一行的`parent`字段,那么这两行就存在层级关系。这有助于构建整个树形结构。 3. **`LEVEL`伪列** 在层次查询中,`LEVEL`伪列会...
首先,要了解的是,在Oracle中,树形结构数据的查询主要依赖于START WITH...CONNECT BY PRIOR语句。这种查询方式允许用户指定起始节点(根节点),并通过CONNECT BY子句定义父子节点之间的递归关系。这种方式特别...
在Oracle中,实现树状查询的核心在于使用`CONNECT BY`子句与`START WITH`子句。这两个子句共同作用,可以按照定义的层级关系遍历表中的记录,并按照树状结构进行排序和展示。 #### 1. `START WITH`子句 `START ...
在"connectby.sql"文件中,可能包含了使用`CONNECT BY`创建组织结构、展示家族树或者分析数据依赖关系的例子。基本语法如下: ```sql SELECT column_list FROM table_name START WITH condition CONNECT BY prior ...
Oracle提供了强大的`CONNECT BY`子句,它能够有效地进行层次查询,帮助用户理解复杂的关系结构。下面我们将深入探讨Oracle层次查询的核心概念、语法结构以及实际应用案例。 #### 一、CONNECT BY子句简介 `CONNECT ...
通过理解`start with`、`connect by prior`和`order siblings by`的用法,我们可以有效地展示和操作层次数据。不过,实际应用时要注意性能优化,避免因递归深度过大而导致的问题,并考虑在模板渲染时的替代方案。
这里介绍一种使用`sys_connect_by_path()`函数结合`connect by`语法的方法。 **示例代码:** ```sql SELECT name, MAX(REPLACE(SUBSTR(sys_connect_by_path(course, '*'), 2), '*', ';')) AS courses FROM ( ...
以下是一个使用`CONNECT BY`的例子: ```sql SELECT level, id, name FROM DEPARTMENT START WITH ID = :root_id CONNECT BY PRIOR ID = PARENT_ID; ``` 这段SQL会返回以`:root_id`为根的所有子节点,`level`字段...
CONNECT TO username IDENTIFIED BY password USING 'connectstring'; ``` `connectstring`是远程数据库的标识,可能包含网络接口驱动程序、服务器名称和数据库实例等信息。Oracle提供了数据字典视图`ALLDBLINKS`...