首页 > 数据库 >ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)

ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)

时间:2023-09-19 15:07:34浏览次数:41  
标签:LEVEL -- PRIOR Level EMPNO Start CONNECT MGR SELECT


查找员工编号为7369的领导:



1 SELECT LEVEL,E.* FROM EMP E CONNECT BY PRIOR E.MGR = E.EMPNO  START WITH E.EMPNO = 7876
2 ORDER BY LEVEL DESC



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点

"start with" -- this identifies all LEVEL=1 nodes in the tree

"connect by" -- describes how to walk from the parent nodes above to their children and 
their childrens children.

Easiest to use an example on emp. If we start with "where mgr is NULL", we generate the 
set of employees that have no mgr (they are the top of the tree). If we

CONNECT BY PRIOR EMPNO = /* current */ MGR

that will take all of the PRIOR records (the start with at first) and find all records 
such that the MGR column equals their EMPNO (find all the records of people managed by 
the people we started with).

使用WITH语句优化查询结果:优化等级



1 WITH A AS
 2  (SELECT MAX(LEVEL) + 1 LVL
 3     FROM EMP E
 4   CONNECT BY PRIOR E.MGR = E.EMPNO
 5    START WITH E.EMPNO = 7876
 6    ORDER BY LEVEL DESC)
 7 SELECT A.LVL 最高等级加1,
 8        LEVEL 当前等级,
 9        A.LVL - LEVEL 优化后等级,
10        E.*  FROM A,
11        EMP E CONNECT BY PRIOR E.MGR = E.EMPNO START WITH E.EMPNO = 7876 ORDER BY LEVEL DESC



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点_02

查找员工编号为7839的所有下属(7839为king):



1 SELECT LEVEL 等级, E.*
2   FROM EMP E
3 CONNECT BY PRIOR E.EMPNO = E.MGR
4  START WITH E.EMPNO = 7839



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点_03

--构造整个的层次结构



1 select lpad(' ',level*2,' ')||ename ename, empno, mgr
2     from emp
3     START WITH MGR IS NULL
4     CONNECT BY PRIOR EMPNO = MGR



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_SYS_04

So, KING is the start with set then JONES BLAKE and CLARK fall under him. Each of them 
becomes the PRIOR record in turn and their trees are expanded.


使用Connect By 结合 level构造虚拟行:



1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_oracle_05

使用rownum实现类似的功能:



1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_SYS_06

---------------------待续-----------------------

使用UNION ALL构造两层节点的树:

视图如下所示:


1 CREATE OR REPLACE VIEW TREE_VIEW AS
 2 SELECT
 3  '1' AS rootnodeid,
 4  'xxxx有限责任公司' AS treename,
 5  '-1'  AS parent_id
 6 FROM dual
 7 UNION
 8 SELECT
 9   to_char(d.deptno),
10   d.dname || '_' ||d.loc,
11   '1' AS parent_id
12  FROM dept d;



查询语句:



1 SELECT T.*, LEVEL
2   FROM TREE_VIEW T
3  START WITH T.PARENT_ID = '-1'
4 CONNECT BY PRIOR T.ROOTNODEID = T.PARENT_ID



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_oracle_07

-----以下为更新内容:

1、先查看总共有几个等级:



1 SELECT COUNT(LEVEL)
2   FROM EMP E
3 CONNECT BY PRIOR E.EMPNO = E.MGR
4  START WITH E.MGR IS NULL;



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_oracle_08

2、查看每个等级的人数。主要是通过LEVEL进行GROUP BY



1 SELECT COUNT(LEVEL)
2   FROM EMP E
3 CONNECT BY PRIOR E.EMPNO = E.MGR
4  START WITH E.MGR IS NULL
5  GROUP BY LEVEL;



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_SYS_09

3、Oracle 10g提供了一个简单的connect_by_isleaf=1,

0 表示非叶子节点



1 SELECT LEVEL AS 等级, CONNECT_BY_ISLEAF AS 是否是叶子节点, E.*
2   FROM EMP E
3 CONNECT BY PRIOR E.EMPNO = E.MGR
4  START WITH E.MGR IS NULL



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_SYS_10

4、SYS_CONNECT_BY_PATH

Oracle 9i提供了sys_connect_by_path(column,char),其中column 是字符型或能自动转

换成字符型的列名。它的主要目的就是将父节点到当前节点的”path”按照指定的模式展现出现。这个函数只能使用在层次查询中。



1 SELECT LEVEL AS 等级,
2        CONNECT_BY_ISLEAF AS 是否是叶子节点,
3        LPAD(' ', LEVEL * 2 - 1) || SYS_CONNECT_BY_PATH(ENAME, '=>')
4   FROM EMP E
5 CONNECT BY PRIOR E.EMPNO = E.MGR
6  START WITH E.MGR IS NULL;



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点_11

5、修剪树枝和节点:

ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_oracle_12

    过滤掉编号是7566的数据(修剪节点),他指的是把这个节点给裁掉,但是并没有破坏树结构,它的子节点还是可以正常的显示。



1 SELECT LEVEL AS 等级,
2        CONNECT_BY_ISLEAF AS 是否是叶子节点,
3        LPAD(' ', LEVEL * 2 - 1) || SYS_CONNECT_BY_PATH(ENAME, '=>'),
4        E.*
5   FROM EMP E
6 WHERE e.empno != 7566
7 CONNECT BY PRIOR E.EMPNO = E.MGR
8  START WITH E.MGR IS NULL;



ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点_13


ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点_14

裁掉编号是7698的节点和它的子节点:



1 SELECT LEVEL AS 等级,
2        CONNECT_BY_ISLEAF AS 是否是叶子节点,
3        LPAD(' ', LEVEL * 2 - 1) || SYS_CONNECT_BY_PATH(ENAME, '=>'),
4        E.*
5   FROM EMP E
6 CONNECT BY PRIOR E.EMPNO = E.MGR
7        AND E.EMPNO != 7698
8  START WITH E.MGR IS NULL;




ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_SYS_15

6、CONNECT_BY_ROOT的使用,oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值。






1 SELECT LEVEL AS 等级,
2        CONNECT_BY_ISLEAF AS 是否是叶子节点,
3        CONNECT_BY_ROOT ENAME,
4        LPAD(' ', LEVEL * 2 - 1) || SYS_CONNECT_BY_PATH(ENAME, '=>'),
5        E.*
6   FROM EMP E
7 CONNECT BY PRIOR E.EMPNO = E.MGR
8  START WITH E.MGR IS NULL;






 

ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_子节点_16

对于层次查询如果用order by排序,比如order by last_name则是先做完层次获得level,然后按last_name 排序,这样破坏了层次,比如特别关注某行的深度,按level 排序,也是会破坏层次的。在oracle10g中,增加了siblings 关键字的排序。

语法:order siblings by <expre>

它会保护层次,并且在每个等级中按expre排序。


1 SELECT LEVEL AS 等级,
2        CONNECT_BY_ISLEAF AS 是否是叶子节点,
3        LPAD(' ', LEVEL * 2 - 1) || SYS_CONNECT_BY_PATH(ENAME, '=>'),
4        E.*
5   FROM EMP E
6 CONNECT BY PRIOR E.EMPNO = E.MGR 
7  START WITH E.MGR IS NULL
8  ORDER SIBLINGS BY  E.ENAME;




ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)_oracle_17

connect_by_iscycle(存在循环,将返回1,否则返回0)

The CONNECT_BY_ISCYCLE pseudocolumn returns 1 if the current row has a child which is also its ancestor. Otherwise it returns 0. 
You can specify CONNECT_BY_ISCYCLE only if you have specified the NOCYCLE parameter of the CONNECT BY clause. NOCYCLE enables Oracle to return the results of a query that would otherwise fail because of a CONNECT BY loop in the data.


没有人可以和生活讨价还价,所以只要活着,就一定要努力。



标签:LEVEL,--,PRIOR,Level,EMPNO,Start,CONNECT,MGR,SELECT
From: https://blog.51cto.com/u_1481758/7525073

相关文章

  • 实现连续对话,人机交互更自然
    随着科技的快速发展,人工智能领域取得了突破性的进步。最近,一种名为ChatGPT的人工智能模型因其能够实现“连续对话”机制而备受瞩目。这种技术的出现改变了传统搜索引擎和聊天机器人的工作方式,让人们能够更自然地与计算机进行交互。ChatGPT是一种基于深度学习的自然语言处理模型,它能......
  • Exchange 2019 服务器实战化操作-- 6. Outlook 邮件彻底删除之后的恢复
    ==回顾:==上篇文章我们介绍了如何配置Exchangeserver2019的电子数据展示和保留,该功能将有助于企业合规部门对于用户邮件的审查和诉讼保留,今天我们要学习的对象同样也是Exchange非常重要而且很实用的一个功能:SingleItemRecovery,也就是说邮件在客户端删除后的恢复,如果已删除项......
  • 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意
    为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下。 总结1:附件参数g的用法 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详......
  • sql server单一某列实现排序
    WDBHAPPBHWDMC430175500443659sg430044033903992转发省环境保护厅省财政厅关于印发广东省排污权有偿使用和交易试点管理办法的通知(会签文)(修改).doc430175500443659430044033903992转发省环境保护厅省财政厅关于印发广东省排污权有偿使用和交易试点管理办法的通知(会签文).doc......
  • eclipse打开文件位置插件
    网上找到的easyexplorer其实不太好用,不能打开文件目录,而且在导航栏没有图标,需要手点击找文件夹。好用的还是OpenExplorer。故转载文章如下:     所谓“工欲善其事,必先利其器”,eclipse作为Java开发常用工具,一些小的使用技巧往往会对工作带来很大的便利,或者一些小工具可以大......
  • Linux 调试技术
    本文讨论了四种调试Linux程序的情况。在第1种情况中,我们使用了两个有内存分配问题的样本程序,使用MEMWATCH和YetAnotherMallocDebugger(YAMD)工具来调试它们。在第2种情况中,我们使用了Linux中的strace实用程序,它能够跟踪系统调用和信号,从而找出程序发生错误的地方。在......
  • 解决Logic Apps terraform部署时大小写问题
    今天来分享一个实际工作中遇到的一个问题,首先来描述下场景和问题,我们之前在使用terrafrom来部署一些logicapps,具体部署的方法之后准备单独写博客来分享下,其实也是挺值得谈谈的这次先来简单分析下遇到的问题,logicapps里其实包含了很多子组件,包括trigger,action等等,都用terraform......
  • 软件测试|MySQL 外连接的详细解析与示例
    简介在关系型数据库中,表之间常常存在着关联关系。MySQL提供了多种连接操作,其中之一是外连接(LEFTJOIN和RIGHTJOIN)。本文将深入探讨MySQL中左外连接和右外连接的概念、语法以及使用示例。外连接(LEFTJOIN和RIGHTJOIN)的概念外连接是一种用于从两个表中检索相关数据的SQL操作。它可......
  • 融云观察:AI Agent 是不是游戏赛道的下一个「赛点」?
    ChatGPT的出现,不仅让会话成为了未来商业的基本形态,也把大家谈论AI的语境从科技产业转向了AI与全产业的整合。 关注【融云全球互联网通信云】了解更多而目前最热衷于拥抱生成式AI的行业中,游戏无疑是要“前排报到”的。游戏一直是决策智能的最佳训练场,行业的上一个大IPAlph......
  • Python API教程:API入门(上)
    什么是API?一个API,或被称为应用程序接口,是一个服务器为你提供一个接收或发送数据的代码。API通常用来接收数据。本文就集中焦点在此话题中。当我们想从一个API中接收数据,我们需要开始请求。请求可以包含整个Web。例如,你可以浏览博客文章。你的浏览器开始请求我们的Web服务器,会返回整......