返回顶部
首页 > 资讯 > 数据库 >ORACLE分层查询start with和connect by怎么用
  • 465
分享到

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

2024-04-02 19:04:59 465人浏览 独家记忆
摘要

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

这篇文章主要为大家展示了“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怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: ORACLE分层查询start with和connect by怎么用

本文链接: https://lsjlt.com/news/64855.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ORACLE分层查询start with和connect by怎么用
    这篇文章主要为大家展示了“ORACLE分层查询start with和connect by怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ORACLE分层查询...
    99+
    2024-04-02
  • Oracle递归查询start with connect by prior怎么用
    这篇文章主要介绍Oracle递归查询start with connect by prior怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、基本语法connect by递归查询...
    99+
    2024-04-02
  • oracle中connect by/level/start with怎么用
    这篇文章主要介绍了oracle中connect by/level/start with怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。l...
    99+
    2024-04-02
  • Oracle递归查询connect by用法
    目录一、概述1、层级查询的基本语法:二、使用1、基本用法2、SYS_CONNECT_BY_PATH() 函数3、CONNECT_BY_ISLEAF 伪列4、CONNECT_BY_RO...
    99+
    2024-04-02
  • oracle中connect by怎么用
    这篇文章主要介绍了oracle中connect by怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、基本语法select&...
    99+
    2024-04-02
  • MySQL实现递归查询的4中方案,与Oracel中CONNECT BY 和 START WITH子句实现效果一致
    这里写自定义目录标题 最近的工作中遇到,需要将Oracel库转到Mysql库,有些语法不同,需要重写对应的SQL语句,这次遇到的是start with 递归查询的修改第一种方案,MySQL8....
    99+
    2023-09-01
    sql mysql oracle
  • oracle中connect by prior递归算法怎么用
    这篇文章主要介绍oracle中connect by prior递归算法怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! oracle中 connec...
    99+
    2024-04-02
  • SQLServer和Oracle中怎么实现分页查询
    本篇文章为大家展示了SQLServer和Oracle中怎么实现分页查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.分页算法 最开始我在网上查找资料的...
    99+
    2024-04-02
  • oracle分页查询怎么写
    oracle 分页查询可以通过使用 rownum 伪列实现,它返回当前行的行号,语法为:select from (select , rownum as rn fro...
    99+
    2024-05-21
    oracle
  • mysql怎么使用left join和group by实现高效查询
    这期内容当中小编将会给大家带来有关mysql怎么使用left join和group by实现高效查询,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。mysql高效查询mysql牺牲了group by来增加l...
    99+
    2023-06-15
  • oracle怎么实现分页查询
    在Oracle中,可以通过使用ROWNUM和子查询来实现分页查询。以下是一个示例:```sqlSELECT * FROM (SELECT column1, column2, ..., ROWNUM AS rnFROM y...
    99+
    2023-08-11
    oracle
  • oracle怎么查询分区数据
    Oracle可以使用以下方法查询分区数据: 使用普通的SELECT语句查询分区数据:可以使用普通的SELECT语句来查询分...
    99+
    2024-04-09
    oracle
  • oracle子查询怎么用
    子查询是嵌套在主查询中的独立查询,用于提供数据。oracle支持相关和非相关子查询,语法为:(子查询)。使用步骤包括:确定数据需求、编写子查询、嵌入主查询。优点包括:提高性能、简化查询、...
    99+
    2024-05-21
    oracle
  • oracle怎么查询用户权限和角色
    您可以通过以下的SQL语句来查询用户的权限和角色:1. 查询用户拥有的权限:```SELECT * FROM USER_SY...
    99+
    2023-08-31
    oracle
  • mysql中group by分组查询中查询最新字段值的sql语句怎么写?
    目录 背景需求效率不高的sql写法效率高的sql写法拓展 背景 今天看代码的时候,看到一个比较复杂的sql语句,我知道这条sql语句最终想要实现的结果,所以我就想自己写sql来实现一下...
    99+
    2023-09-11
    mysql sql 数据库
  • oracle怎么查询用户表
    要查询Oracle数据库中的用户表,可以使用以下的SQL查询语句:```SELECT * FROM user_tables;...
    99+
    2023-08-25
    oracle
  • 怎么理解Oracle数据库中的多表查询,分组查询,子查询
    本篇内容介绍了“怎么理解Oracle数据库中的多表查询,分组查询,子查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • oracle怎么查询用户下的表和行数
    要查询用户下的表和行数,可以使用以下SQL查询语句: SELECT table_name, num_rows FROM al...
    99+
    2024-05-13
    oracle
  • mysql怎么用分页查询
    mysql 中的分页查询通过以下步骤实现:确定要查询的页面和每页大小。计算偏移量:偏移量 = (页面号 - 1) * 每页大小。使用 limit 子句:select * fro...
    99+
    2024-05-22
    mysql
  • oracle怎么查询表结构和注释
    要查询表结构和注释,可以使用以下SQL语句: SELECT COLUMN_NAME, DATA_TYPE, DATA_LEN...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作