加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle学习之:CONNECT BY层次化查询

发布时间:2020-12-12 14:44:13 所属栏目:百科 来源:网络整理
导读:层次化查询,顾名思义就是把查询结果有层次的呈现出来。层次化查询结果类似于树状结构, 最顶端的是“根节点”, 下面是“父节点”, 没有子节点的是“叶节点”。 为了让一个或多个表具有层次关系,必须使用相关的字段将表关联起来。比如SCOTT用户下的SCOTT.

层次化查询,顾名思义就是把查询结果有层次的呈现出来。层次化查询结果类似于树状结构,

最顶端的是“根节点”,

下面是“父节点”,

没有子节点的是“叶节点”。

为了让一个或多个表具有层次关系,必须使用相关的字段将表关联起来。比如SCOTT用户下的SCOTT.EMP表中的EMPNO和MGR列。

基本语法为:

[START WITH conditiona1] CONNECT BY condition2

START WITH conditiona1:用来指定根节点,condition1中可以加子查询。

CONNECT BY condition2:condition2中必须包含PRIOR关键字,用来指定列是来自父行。PRIOR可以位于比较操作符的任何一方。condition不能包含子查询。

如:

打开SQL窗口:

SELECT T.EMPNO,T.MGR,T.ENAME,T.HIREDATE
FROM SCOTT.EMP T
START WITH T.MGR IS NULL
CONNECT BY PRIOR T.EMPNO = T.MGR;

EMPNO MGR ENAME HIREDATE

----------------------------------------------------------------------

1 7839 KING 1981/11/17
2 7566 7839 JONES 1981/4/2
3 7788 7566 SCOTT 1987/4/19
4 7876 7788 ADAMS 1987/5/23
5 7902 7566 FORD 1981/12/3
6 7369 7902 SMITH 1980/12/17
7 7698 7839 BLAKE 1981/5/1
8 7499 7698 ALLEN 1981/2/20
9 7521 7698 WARD 1981/2/22
10 7654 7698 MARTIN 1981/9/28
11 7844 7698 TURNER 1981/9/8
12 7900 7698 JAMES 1981/12/3
13 7782 7839 CLARK 1981/6/9
14 7934 7782 MILLER 1982/1/23


为了知道当前查询树状结构所处的层次,可以使用level伪列。加入level伪列后显示如下

SELECT LEVEL,
LPAD(' ',2 * (LEVEL - 1)) || T.ENAME "EmpName",
T.HIREDATE,
T.SAL
FROM SCOTT.EMP T
START WITH T.MGR IS NULL
CONNECT BY T.MGR = PRIOR T.EMPNO;

LEVEL EmpName HIREDATE SAL 1 1 KING 1981/11/17 5000.00 2 2 JONES 1981/4/2 2975.00 3 3 SCOTT 1987/4/19 3000.00 4 4 ADAMS 1987/5/23 1100.00 5 3 FORD 1981/12/3 3000.00 6 4 SMITH 1980/12/17 800.00 7 2 BLAKE 1981/5/1 2850.00 8 3 ALLEN 1981/2/20 1600.00 9 3 WARD 1981/2/22 1250.00 10 3 MARTIN 1981/9/28 1250.00 11 3 TURNER 1981/9/8 1500.00 12 3 JAMES 1981/12/3 950.00 13 2 CLARK 1981/6/9 2450.00 14 3 MILLER 1982/1/23 1300.00

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读