Oracle connect by 树查询之三(超详细)

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

1 SELECT LEVEL,E.* FROM EMP E CONNECT BY PRIOR E.MGR = E.EMPNO  START WITH E.EMPNO = 78762 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).

使用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

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

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

--构造整个的层次结构

1 select lpad(‘ ‘,level*2,‘ ‘)||ename ename, empno, mgr2     from emp3     START WITH MGR IS NULL4     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构造虚拟行:

1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5

使用rownum实现类似的功能:

1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5

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

使用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_id12  FROM dept d;

查询语句:

1 SELECT T.*, LEVEL2   FROM TREE_VIEW T3  START WITH T.PARENT_ID = ‘-1‘4 CONNECT BY 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.

时间: 2024-08-01 19:41:37

Oracle connect by 树查询之三(超详细)的相关文章

Oracle树查询(start with connect by prior)探究

oracle树查询的最重要的语法结构是:select-start with-connect by-prior,通过该查询可以将表中的关系以树的形式展示出来. 1.创建测试表及数据: --创建测试表 CREATE TABLE YAG_TREE( T_ID NUMBER(10) NOT NULL, --id T_CONTEXT VARCHAR2(20),   --内容 PARENTID NUMBER(10)       --父 id ); --创建序列 CREATE SEQUENCE SEQ_YAG

安装64位Oracle 10g超详细教程

安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连接,本例使用的所有命令和操作都是在X-Manager下进行.X-Manager安装完成后的配置方法如下: 1.  打开X-Manager的X-Shell 2. 点击New,新建一个连接地址,设置完成后,点击OK3.  使用用户名,密码进行登录,登录完成后,进入如下图所示画面即成功连接到Linux系统

Oracle树查询及函数

Oracle树查询的最重要的就是select...start with... connect by...prior语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 以我做过的一个项目中的表为例,表结构如下: Sql代码   CREATE TABLE FLFL ( ID      NUMBER                

Oracle树查询总结

最近在做公司的项目中遇到一个问题,多级级联导航菜单,虽然只有三级目录,但<li>中嵌套<ul>,数据库表结构如下: 1 CREATE TABLE FLFL 2 ( 3 ID NUMBER NOT NULL, 4 MC NVARCHAR2(20), 5 FLJB NUMBER, 6 SJFLID NUMBER 7 ) 很常见的表结构,包括自身ID和父ID,对于这种我们已不陌生,在写树状菜单的时候经常见到这样的数据结构,但是我们一般写树状菜单的时候都会用到前端的框架比如zTree或者t

Oracle树查询

Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 以我做过的一个项目中的表为例,表结构如下: Sql代码 CREATE TABLE FLFL ( ID NUMBER NOT NULL, MC NVARCHA

Oracle树查询(查询所有子节点,父节点等等)_转载

Oracle树查询(查询所有子节点,父节点等等) 转载 2016年01月14日 10:11:55 Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 以我做过的一个项目中的表为例,表结构如下: Sql代码 1

oracle中的树状查询

oracle中的树状查询 工作中经常会遇到将数据库中的数据以树的形式展现的需求.以下我们来看一下该需求在Oracle中如何实现. 首先我们需要有一个树形的表结构(当然有时候会出现表结构不是典型的树形结构,而是多表存储,需要根据多表连接查询生成树) 一.树型表结构:节点ID  上级ID  节点名称 二.用法: select 节点ID,节点名称,levelfrom 表名connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 说明:1.常见的树形结构为公司组

以面向对象的思想实现数据表的添加和查询,JDBC代码超详细

以面向对象的思想编写JDBC程序,实现使用java程序向数据表中添加学生信息,并且可以实现给定×××号查询学生信息或给定准考证号查询学生信息. 创建的数据表如下: CREATE TABLE EXAMSTUDENT(FlowID INTEGER,Type INTEGER,IDCard VARCHAR(18),ExamCard VARCHAR(15),StudentName VARCHAR(20),Location VARCHAR(20),Grade INTEGER);1.首先实现通过java程序在

Oracle “CONNECT BY” (层级递归查询)

Oracle "CONNECT BY"是层次查询子句,一般用于树状或者层次结果集的查询.其语法是: ? 1 2 [ START WITH condition ] CONNECT BY [ NOCYCLE ] condition The start with .. connect by clause can be used to select data that has a hierarchical relationship (usually some sort of parent-&g