转:oracle connect by level start with使用

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

Syntax 1

CONNECT BY[NOCYCLE] <condition>START WITH<condition>
Syntax 2 START WITH<condition>CONNECT BY[NOCYCLE] <condition>

参考网址:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:489772591421

http://psoug.org/reference/connectby.html

http://www.oradev.com/connect_by.jsp

http://philip.greenspun.com/sql/trees.html
查找员工编号为7369的领导:

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

"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 A AS

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

WITH A AS
 (SELECT MAX(LEVEL) + 1 LVL
    FROM EMP E
  CONNECT BY PRIOR E.MGR = E.EMPNO
   START WITH E.EMPNO = 7876
   ORDER BY LEVEL DESC)
SELECT A.LVL 最高等级加1,LEVEL 当前等级,A.LVL - LEVEL 优化后等级,E.*  FROM A,EMP E CONNECT BY PRIOR E.MGR = E.EMPNO START WITH E.EMPNO = 7876 ORDER BY LEVEL DESC

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

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

--构造整个的层次结构

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

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构造虚拟行:

SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5

使用rownum实现类似的功能:

SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5

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

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

视图如下所示:

 CREATE OR REPLACE VIEW TREE_VIEW AS
 SELECT
  '1' AS rootnodeid,  'xxxx有限责任公司' AS treename,  '-1'  AS parent_id
 FROM dual
 UNION
 SELECT
   to_char(d.deptno),d.dname || '_' ||d.loc,'1' AS parent_id
  FROM dept d;

查询语句:

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

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

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

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

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

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

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

0 表示非叶子节点

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

4、SYS_CONNECT_BY_PATH

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

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

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

5、修剪树枝和节点:

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

 SELECT LEVEL AS 等级,        CONNECT_BY_ISLEAF AS 是否是叶子节点,        LPAD(' ','=>'),        E.*
   FROM EMP E
 WHERE e.empno != 7566
 CONNECT BY PRIOR E.EMPNO = E.MGR
  START WITH E.MGR IS NULL;


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

 SELECT LEVEL AS 等级,        E.*
   FROM EMP E
 CONNECT BY PRIOR E.EMPNO = E.MGR
        AND E.EMPNO != 7698
  START WITH E.MGR IS NULL;

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

 SELECT LEVEL AS 等级,        CONNECT_BY_ROOT ENAME,        E.*
   FROM EMP E
 CONNECT BY PRIOR E.EMPNO = E.MGR
  START WITH E.MGR IS NULL;

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

语法:order siblings by <expre>

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

 SELECT LEVEL AS 等级,        E.*
   FROM EMP E
 CONNECT BY PRIOR E.EMPNO = E.MGR 
  START WITH E.MGR IS NULL
  ORDER SIBLINGS BY  E.ENAME;

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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Java Oracle 结果集是Java语言中处理数据库查询结果的一种方式。通常情况下,Java程序会通过JDBC连接Oracle数据库并执行一条查询语句,返回一个ResultSet结果集。ResultSet是一个行集,包含了查询语句的返回结果。在
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密。在计算机通信领域,AES加密算法是一种十分重要的保密技术,被广泛应用于银行、保险、互联网电子支付等重要场合。
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台性等优势,被广泛应用于企业级应用开发。而Oracle11g是一个强大的关系型数据库,由于其优秀的可靠性、安全性和扩展性,已经被广泛应用于企业级应用中。Jav
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的组成部分。为了满足移动端用户的需求,我们可以使用jQuery开发移动端大转盘抽奖活动。
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常被用来搭建高效的软件系统。Java是一种面向对象的编程语言,而Oracle是一种关系型数据库管理系统。Java 和Oracle在应用中的联系非常紧密,它们能够通过相互
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上,而 Oracle 是一个广泛使用的数据库软件。在 Java 对 Oracle 进行操作时,需要使用 Oracle 参数来确保程序正确工作。本文将从 Oracle 参数的定义、分类
随着电子竞技的兴起,越来越多的人开始慕名玩起了王者荣耀。而对于Python爱好者来说,这款游戏也有着很大的吸引力。因为Python可以帮助我们获取并处理游戏数据,从而获得更好的游戏体验。
Java与Oracle在数据处理方面都有着非常重要的地位,而在Java和Oracle的结合中,Integer类型则起到了不可替代的作用。Integer类型是Java中一个非常常用的数据类型,它可以表示范围在-2147483648到2147483647之间的整数
如今,JavaScript已经成为了web开发的必备技能之一,而IE浏览器也是众多开发者最常用的浏览器,那么,如何启用IE浏览器的JavaScript呢?
Java与Oracle是当今软件行业中广泛使用的两个技术。而SP(Stored Procedure)是Oracle数据库中存储过程的组件,可以在Java中调用Oracle数据库中的SP。在开发过程中,Java和Oracle的组合可以方便处理大规模的数据和建
Java(Java SE)和Oracle是当今世界上广泛使用的两个技术,这两个技术的认证课程可以帮助开发人员提升技能和技术水平,更有效地完成自己的任务和项目。Java-OCA,Java-OCP和Oracle数据库认证是Java和Oracle认证中最
今天我们来聊一下Java、Oracle以及Weka,这三个技术与数据挖掘密不可分,都是数据挖掘中的常见技术和工具。
在当前的软件开发领域里,Java、Oracle和Excel无疑是三款非常重要的开发工具。Java是一种面向对象的编程语言,非常灵活,可以应用于开发任何类型的应用程序;Oracle则是一种关系型数据库系统,一直以来都是企业级应用
Java和Oracle是两个经常使用的工具,而它们的字符集是程序员需要掌握且深入了解的内容。字符集是计算机语言中用来表示字符的编码集合,它包含了各种字符的数字代码,方便存储和处理。Java和Oracle使用的字符集不仅限
Java Kerberos是一种安全验证机制,目前被广泛应用于企业级系统中。当系统中的多个服务需要在用户身份验证过程中互相通信时, Java Kerberos 就可以派得上用场了。同时, Oracle 数据库也可以对 Java Kerberos 进行
Java和Oracle数据库都是非常常用的软件开发工具,其中Timestamp是两者之间共同使用的一种数据类型。在本文中,我们将讨论Java中如何使用Oracle Timestamp,并通过举例说明它在实际开发中的应用。
Java JDK Oracle 是目前广泛使用的编程语言和软件平台。Java 是一种面向对象的编程语言,具有跨平台和可移植性的优点。而Oracle 是一家提供多种数据库服务的公司,包括提供 Java 开发环境。
JavaScript是一门广泛使用的程序设计语言,拥有丰富的生态系统和强大的扩展能力。Intl是JavaScript提供的一个用于国际化支持的API,它可以帮助我们轻松地处理文本格式化、日期和时间格式化、数字格式化以及货币格式化
Java作为一门高级编程语言,以其跨平台和面向对象的特性已经成为一门被广泛应用的编程语言。而Oracle作为一款功能强大的关系数据库管理系统,它与Java语言的结合更为紧密。本文将介绍Java与Oracle结合的优点和应用场
Java是一种广泛使用的编程语言,而Oracle是目前使用最广泛的数据库管理系统之一。在Java中使用Oracle进行数据存储和管理时,涉及到一个重要的概念——TNS Name。TNS Name是Oracle数据库的唯一标识,用于标识要连接哪