层次查询子句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:是单一操作符,放在列名的前面,等号左右均可;
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;
分享到:
相关推荐
下面将详细阐述`CONNECT BY`的使用方法、原理以及一些常见的应用场景。 1. **基本语法** `CONNECT BY` 的基本语法如下: ```sql SELECT column1, column2, ... FROM table_name START WITH condition1 CONNECT BY ...
Connect By 可以列出上下级关系 构造序列 求排列组合 逆转求出下上级的关系路径
"Connect By的使用探索" Connect By是一种递归查询语句,用于实现树形结构的查询和遍历。它是 Oracle 数据库中的一种特色语句,能够高效地查询树形结构的数据。 Connect By的基本语法 Connect By语句的基本语法...
通过本文,我们详细介绍了Oracle数据库中 `START WITH` 和 `CONNECT BY` 的使用方法以及应用场景。这两个关键字对于处理具有层级结构的数据非常有用。此外,我们还讨论了如何利用 `LEVEL` 关键字来显示节点所在的...
Oracle数据库中的`CONNECT BY PRIOR`是一个强大的查询构造器,用于处理树形数据结构,尤其在组织层级、部门结构或者员工管理系统中非常常见。这个功能允许我们从一个或多个根节点开始,按照指定的规则遍历整个树结构...
行列转换,层级关系,oracle sys_connect_by_path的用法
### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...
本文章详细介绍了Oracle中connect by...start with...的用法。
connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制 prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,...
Oracle 使用 `CONNECT BY` 子句以及 `LEVEL`, `PRIOR`, `CONNECT_BY_ROOT` 等伪列来实现递归查询。相比之下,DB2 使用递归 CTE 和 `UNION ALL` 来实现相同的功能。 #### 动机 在将应用从 Oracle 迁移到 DB2 的过程...
文章中给出了一个名为`t_test_connectby`的数据表例子,其中包含父子关系的节点数据。通过该表,我们可以更直观地了解Connect By的执行过程。 - 不指定起始条件时,使用`CONNECT BY`: ```sql SELECT * FROM t_test...
CONNECT BY 的用法可以形成一个树状结构,目前只有 Oracle 支持,其他数据库都要结合存储过程实现。 语法结构为:SELECT * FROM some_table [WHERE 条件 1] CONNECT BY [条件 2] START WITH [条件 3]; 其中,...
例如,你可以使用`CONNECT BY PRIOR ID = PARENT_ID AND LEVEL ,这将遍历到第五级的子节点。 4. **LEVEL伪列**: Oracle在`CONNECT BY`查询过程中自动提供了一个`LEVEL`伪列,它表示当前行在树结构中的深度,从1...
### Oracle `CONNECT BY` 用法总结 `CONNECT BY` 是Oracle SQL中用于创建和遍历层次结构数据的语法。它允许你从一个或多个具有层级关系的表中提取出树形结构。以下是`CONNECT BY`的基本用法: 1. **树查询(递归...
Oracle数据库中的`connect by prior`是一个强大的SQL查询构造,用于处理具有层级关系的数据,常见于组织结构、部门层级、时间序列分析等场景。这个特性允许我们遍历和查询树形结构,将层次数据平展为一行一列的形式...
此问题通常是由于 PL/SQL Developer 的配置不当或者使用的 Oracle 客户端版本较低,不支持 `Connect By` 功能。 #### 三、解决步骤 本文将详细介绍如何解决以上问题,并提供了一键解决方法,即通过下载并正确配置 ...
使用方法:`SELECT lvtao_demo_a(5);` ### 第二种方法:存储过程+中间表 这种方法使用了一个存储过程`sss`,配合一个临时中间表来存储子级ID。存储过程首先设置一个游标遍历当前层级的子项,然后对每个子项调用...
`START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM table_name START WITH condition CONNECT BY PRIOR child_column = parent_column; ``` 其中: - `START WITH`: 指定查询的起始条件...
在实际应用中,"connect-header"的使用方法通常是将其作为中间件插入到Express的路由处理链中。例如: ```javascript const connectHeader = require('connect-header'); const express = require('express'); ...