此文章引用自:http://www.cnblogs.com/caroline/archive/2011/12/25/2301083.html

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的领导:

  ,E.  EMP E CONNECT  PRIOR E.MGR  E.EMPNO  START  E.EMPNO

"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语句优化查询结果:优化等级

  A ( ()   LVLEMP ECONNECT  PRIOR E.MGR  E.EMPNOSTART  E.EMPNO  )A.LVL 最高等级加1,当前等级,A.LVL   优化后等级,E.   A,EMP E CONNECT  PRIOR E.MGR  E.EMPNO START  E.EMPNO

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

   等级, E.EMP ECONNECT  PRIOR E.EMPNO  E.MGRSTART  E.EMPNO

--构造整个的层次结构

  lpad( ,, )ename ename, empno, mgrempSTART  MGR  CONNECT  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构造虚拟行:

1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5

使用rownum实现类似的功能:

1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5

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

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

视图如下所示:

     TREE_VIEW rootnodeid,treename,parent_iddualto_char(d.deptno),d.dname   d.loc,parent_iddept d;

查询语句:

  T., TREE_VIEW TSTART  T.PARENT_ID  CONNECT  PRIOR T.ROOTNODEID  T.PARENT_ID

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

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

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

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;

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

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;

5、修剪树枝和节点:

过滤掉编号是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;

裁掉编号是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;

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;

对于层次查询如果用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;

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.

转载于:https://blog.51cto.com/8967938/1699556

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

  1. oracle+connect+by+level,oracle connect by用法篇

    1.基本语法 select * from table [start with condition1] connect by [prior] id=parentid1 2 一般用来查找存在父子关系的数据 ...

  2. oracle——connect by level

    connect by 层级查询 用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询 语法格式: { CONNECT BY [ NOCYCLE ] condition [AND condition ...

  3. oracle connect by用法篇

    原文链接:https://blog.csdn.net/wang_yunj/article/details/51040029 1.基本语法 select * from table [start with ...

  4. Oracle connect by与level的使用

    1.level是什么? level是在树形结构中.表示层级的伪列. 1.1树形结构 Oracle支持树形结构的查询,用关键字connect by 表示. connect by表示在构造树形结构时,上下 ...

  5. Oracle Connect By Start With 总结==转帖

    Oracle Connect By Start With 总结==转帖 Oracle 实在太强了,本篇文章详细介绍了Oracle的递归查询语法,利用此语法,可以方便地实现递归的双向查询: -- Tir ...

  6. Start with - Connect by - level

    Code --根目录开始遍历 --向下遍历    select prior a "prior_a" , prior b "prior_b" , prior c  ...

  7. db2 如何 将 oracle CONNECT BY 移植到 DB2

     将 CONNECT BY 移植到 DB2 http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0510rielau ...

  8. oracle pl/sql level妙用

    转载网址:http://blog.csdn.net/evildog/article/details/8903724 该文章仅用于记事本保留,大家也可以看 1.当需要把一个字符串按某一分隔符分隔后,变为 ...

  9. oracle 层次查询 connect by

    Hierarchical Queries 语法 connect by [nocycle] condition [start with condition] start with condition c ...

  10. connect连接oracle6,Oracle Connect By 使用实例

    在实际开发中  connect by可以替代plsql或java中的循环间化开发代码,提高开发效率.如下是我在工作中遇到一个实际解决的问题 具体场景: 原系统是一个管理宿舍信息的系统,dorm_roo ...

最新文章

  1. 调剂女人身材的十种食物
  2. 亚马逊全面回应:涵盖人脸识别、假货等 10 个问题
  3. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )
  4. Spring JdbcTemplate快速入门
  5. rocketmq 初探(二)
  6. 图解系列之JAVA执行过程
  7. 三桥君:如何把SQL Server的数据库导为sql文件
  8. 计算机快捷方式app卸载,一打开电脑就自动出现的快捷方式软件删不掉怎么办
  9. hashcat软件的简单实用
  10. 影视剪辑,视频剪辑素材音效哪里找?超实用剪辑入门必备素材
  11. 基于微信小程序的医院预约挂号系统设计与实现 毕业设计论文 课题题目参考(2)后台管理功能和界面效果
  12. window 系统丢失北京时区解决方案
  13. 什么是泛域名?如何做泛域名解析?
  14. java 163邮箱发邮件_java用163邮箱发邮件的方式,步骤有哪些?
  15. 广域红外望远镜的最新发现:最冷的恒星
  16. [转载]用Java开发企业级无线应用
  17. 挡板门在湿式烟气脱硫系统中是怎样的存在?
  18. 新电脑安装Win7开机老是提示不支持的硬件
  19. java判断手机号码是哪个运营商
  20. NLP自然语言处理—文本分类入门

热门文章

  1. 苹果屏幕使用时间怎么设置_苹果手机屏幕不能旋转怎么办
  2. 分区怎么4k对齐_电脑升级SSD后,依然卡顿怎么解决?
  3. Jquery实现定时器实例
  4. sql截去最后一位_数据技能篇(EXCEL,SQL,Python)
  5. WebLogic及其重要概念
  6. mysql关系数据库_关系型数据库MySql简介
  7. mysql for python 64_解决windows64位系统上安装mysql-python报错
  8. matlab keras,基于预训练的 Keras 层组合网络
  9. Spring Data Jpa的JpaRepository的getOne()方法查询数据实体时报错could not initialize proxy
  10. IDEA中如何给含有main方法的普通类设置JVM参数