温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ORACLE分层查询start with和connect by怎么用

发布时间:2021-11-11 09:27:38 来源:亿速云 阅读:149 作者:小新 栏目:关系型数据库

这篇文章主要为大家展示了“ORACLE分层查询start with和connect by怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ORACLE分层查询start with和connect by怎么用”这篇文章吧。

分层查询是select 语句的扩展,目的是迅速找出表中列-列的隶属关系。

19.1 树的遍历

ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型结构的联系。例如,我们现在讨论雇员信息表EMP,其中含有雇员编号(EMPNO)和经理(MGR)两列,通过这两列反映出来的就是雇员之间领导和被领导的关系。他们之间的这种关系就是一种树结构。

ORACLE分层查询start with和connect by怎么用

树的遍历有两个方向

top--down 自上而下

即父亲找儿子,一个父亲可能有几个儿子,一个儿子可能有几个孙子,遍历不能丢了儿子,顺序以左为先。

down--top 自底向上

即儿子找父亲,一个儿子只能有一个父亲,所以顺序应该是:孙子->儿子-->父亲-->爷爷。

19.2 CONNECT BY 和 START WITH

在SELECT命令中使用CONNECT BY 和 START WITH 子句可以查询表中的树型结构关系。其命令格式如下:

SELECT ...

CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}

[START WITH];

19.3 关于CONNECT BY子句

理解CONNECT BY PRIOR 子句至关重要,它确定了树的检索方向: 是top --> down(父-->子)还是down --> top(子-->父)。

在分层表中,表的父列与子列是确定的(身份固定),如:在emp表中empno是子列(下级), mgr是父列(上级)。

RIOR关键字就像一个箭头("-->"),

connect by prior empno = mgr

connect by mgr = prior empno

两句语法等同,都是说mgr(父)--> empno(子),因此树的检索方向是top --> down。

connect by empno = prior mgr

connect by prior mgr = empno

两句语法等同,都是说empno(子)--> mgr(父),因此树的检索方向是down --> top。

19.4 START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点(每一行都会成为一个树根)。

例1 以树结构方式显示EMP表的数据。

ORACLE分层查询start with和connect by怎么用

SQL>select empno,ename,mgr from emp connect by prior empno=mgr start with empno=7839;

ORACLE分层查询start with和connect by怎么用

仔细看empno这一列输出的顺序,就是上图树状结构每一条分支(从根节点开始)的结构。

mgr(父)--> empno(子),因此树的检索方向是top --> down。

例2 从SMITH节点开始自底向上查找EMP的树结构。

ORACLE分层查询start with和connect by怎么用

SQL>select empno,ename,mgr

from emp

connect by empno=prior mgr

start with empno=7369

/

ORACLE分层查询start with和connect by怎么用

在这种自底向上的查找过程中,只有树中的一枝被显示。

empno(子)--> mgr(父),因此树的检索方向是down --> top

19.5  定义查找起始节点

在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。

ORACLE分层查询start with和connect by怎么用

例3 查找7566(JONES)直接或间接领导的所有雇员信息。

SQL>SELECT EMPNO,ENAME,MGR

FROM EMP

CONNECT BY PRIOR EMPNO=MGR

START WITH EMPNO=7566

/

ORACLE分层查询start with和connect by怎么用

START WITH 不但可以指定一个根节点,还可以指定多个根节点。

例4 查找由FORD和BLAKE 领导的所有雇员的信息。

ORACLE分层查询start with和connect by怎么用

SQL>SELECT EMPNO,ENAME,MGR

FROM EMP

CONNECT BY PRIOR EMPNO=MGR

START WITH ENAME IN ('FORD','BLAKE')

/      父亲找儿子

ORACLE分层查询start with和connect by怎么用

19.6 使用LEVEL

在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次。

伪列LEVEL为数值型,可以在SELECT 命令中用于各种计算。

例5 使用LEVEL改变查询结果的显示形式。

SQL> COLUMN LEVEL FORMAT A20

SQL> SELECT LPAD(LEVEL,LEVEL*3,' ')

as "LEVEL",EMPNO,ENAME,MGR

FROM EMP

CONNECT BY PRIOR EMPNO=MGR

START WITH ENAME='KING'

/

在SELECT使用了函数LPAD,该函数表示以LEVEL*3个空格进行填充,由于不同行处于不同的节点位置,具有不同的LEVEL值,因此填充的空格数将根据各自的层号确定,空格再与层号拼接,结果显示出这种层次关系。

ORACLE分层查询start with和connect by怎么用

ORACLE分层查询start with和connect by怎么用

只查看第2层的员工信息:

SQL> select t1.* from (select level LNUM ,ename,mgr from emp connect by prior empno=mgr start with ename='KING') t1 where LNUM=2;

ORACLE分层查询start with和connect by怎么用

19.7 节点和分支的裁剪

在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

SQL>SELECT LPAD(LEVEL,LEVEL*3,' ')

as "LEVEL",EMPNO,ENAME,MGR

FROM EMP

WHERE ENAME<>'SCOTT'

CONNECT BY PRIOR EMPNO=MGR

START WITH ENAME='KING'

ORACLE分层查询start with和connect by怎么用/

ORACLE分层查询start with和connect by怎么用ORACLE分层查询start with和connect by怎么用

在这个查询中,仅剪去了树中单个节点SCOTT。若希望剪去树结构中的某个分支,则要用CONNECT BY 子句。CONNECT BY 子句是限定树型结构中的整个分支,既要剪除分支上的单个节点,也要剪除其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

例8.显示KING领导下的全体雇员信息,除去SCOTT领导的一支。

SQL>SELECT LPAD(LEVEL,LEVEL*3,' ') as "LEVEL",EMPNO,ENAME,MGR FROM EMP CONNECT BY PRIOR EMPNO=MGR AND ENAME!='SCOTT' START WITH ENAME='KING';

/

ORACLE分层查询start with和connect by怎么用

ORACLE分层查询start with和connect by怎么用ORACLE分层查询start with和connect by怎么用

                           












这个查询结果就除了剪去单个节点SCOTT外,还将SCOTT的子节点ADAMS剪掉,即把SCOTT这个分支剪掉了。

当然WHERE子句可以和CONNECT BY子句联合使用,这样能够同时剪掉单个节点和树中的某个分支。

例9.显示KING领导全体雇员信息,除去雇员SCOTT,以及BLAKE领导的一支。

SCOTT@hyyk> SELECT LPAD(LEVEL,LEVEL*3,' ') as "LEVEL",EMPNO,ENAME,MGR FROM EMP CONNECT BY PRIOR EMPNO=MGR AND ENAME!='SCOTT' and ENAME!='BLAKE' START WITH ENAME='KING';

ORACLE分层查询start with和connect by怎么用

ORACLE分层查询start with和connect by怎么用

在使用SELECT 语句来报告树结构报表时应当注意,CONNECT BY子句不能作用于出现在WHERE子句中的表连接。如果需要进行连接,可以先用树结构建立一个视图,再将这个视图与其他表连接,以完成所需要的查询。

以上是“ORACLE分层查询start with和connect by怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI