START WITH...CONNECT BY PRIOR详解

START WITH...CONNECT BY PRIOR详解

ORACLE中的SELECT语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,CONNECT BY 是结构化查询中用到的,其基本语法是:

SELECT columnName1[,columnName2,…]

FROM tableName1,tableName2,..

[START WITH columnName3]

CONNECT BY {PRIOR col 1 = col 2 | col 1 = PRIOR col 2}

WHERE columnName4;

上述语法主要用查询表中的树型结构关系

columnName3是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

{PRIOR col 1 = col 2 | col 1 = PRIOR col 2}是连接条件

PRIOR表示强制从根节点到叶节点的顺序检索或从强制从叶节点到根节点的顺序检索

columnName4表示过滤条件,是对结果树进行过滤,注意是先有结果树再过滤,不是先过滤再得到结果树

例1

SELECT * FROM EMP

START WITH EMPNO=7369

CONNECT BY  PRIOR MGR = EMPNO;

上述查询语句,从根节点empno = 7369开始查询雇员编号和对应的领导编号的关系,PRIOR放在等号的前面表示从根节点到叶节点查询。如果不写明PRIOR表示默认从叶节点到根节点查询。

例2

SELECT * FROM EMP

WHERE empno <>  7902

START WITH EMPNO=7369

CONNECT BY  PRIOR MGR = EMPNO;

上述查询语句,从根节点empno = 7369开始查询雇员编号和对应的领导编号的关系,得到一棵树,WHERE子句是把这棵树中的EMPNO=7902的节点去掉。

知识扩展
1树结构的描述

树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如emp 表中的empno 和mgr 。empno 表示该雇员的编号,mgr 表示该雇员对应的领导的编号,即子节点的empno 值等于父节点的mgr 值。在表的每一行中都有一个表示父节点的mgr (除根节点外),通过每个节点的父节点,就可以确定整个树结构。

在SELECT 语句中使用START WITH 和CONNECT BY子句可以查询表中的树型结构关系。其语法如下:

SELECT语句

[START WITH]

CONNECT BY {PRIOR 列名1 = 列名2| 列名1 = PRIOR 列名2};

其中:CONNECT BY 子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY 运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR 运算符所在的列表示该列是父节点,相应的另一列则表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

START WITH选项:不但可以指定一个根节点,还可以指定多个根节点。

例3

SELECT * FROM EMP

START WITH EMPNO=7369 OR EMPNO = 7521

CONNECT BY PRIOR MGR = EMPNO;

上述查询语句,从根节点empno = 7369或empno = 7521开始查询雇员编号和对应的领导编号的关系,得到两个根节点

2关于PRIOR

运算符PRIOR 被放置于等号前后的位置,决定着查询时的检索顺序。

PRIOR 被置于CONNECT BY 子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:

CONNECT BY PRIOR EMPNO=MGR

PIROR 运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:

CONNECT BY EMPNO=PRIOR MGR

在这种方式中也应指定一个开始的节点。

3定义查找起始节点

在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。

4.使用LEVEL

在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1 ,根节点的子节点为2 ,依此类推。

5.节点和分支的裁剪

在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE 子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时),如上例2。

6.排序显示

如同在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。
例4

SELECT * FROM EMP

START WITH EMPNO=7902

CONNECT BY PRIOR MGR = EMPNO

ORDER BY empno ASC;

转载 http://hi.baidu.com/no20win/item/9d49653f219dc13b2e0f8186

START WITH...CONNECT BY PRIOR详解的更多相关文章

  1. Oracle层级询语句connect by 用法详解

    如果表中包含层级数据,那么你就可以使用层级查询从句选择行层级顺序. 1.层级查询从句语法 层级查询从句语法: { CONNECT BY [ NOCYCLE ] condition [AND condi ...

  2. 在Oracle 中使用CONNECT BY PRIOR START WITH 语句详解

    语法:connect by 是结构化查询中用到的,其基本语法如下: start with,connect by主要目的:从表中取出树状数据.可以假想成表中存成的各条数据是分别是树中的一个结点. sel ...

  3. React 实践心得:react-redux 之 connect 方法详解

    Redux 是「React 全家桶」中极为重要的一员,它试图为 React 应用提供「可预测化的状态管理」机制. Redux 本身足够简单,除了 React,它还能够支持其他界面框架.所以如果要将 R ...

  4. nRF Connect SDK(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    如何在nRF Connect SDK(NCS)中实现蓝牙空中升级?MCUboot和B0两个Bootloader有什么区别?MCUboot升级使用的image格式是怎么样的?什么是SMP协议?CBOR编 ...

  5. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  6. Oracle函数sys_connect_by_path 详解

    Oracle函数sys_connect_by_path 详解 语法:Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行.其语法一般为:       s ...

  7. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  8. # Okhttp解析—Interceptor详解

    Okhttp解析-Interceptor详解 Interceptor可以说是okhttp的精髓之一,Okhttp重写请求/响应.重试.缓存响应等操作,基本都是在各个Interceptor中完成的,上篇 ...

  9. Docker命令详解

    Docker命令详解   最近学习Docker,将docker所有命令实验了一番,特整理如下: # docker --help Usage: docker [OPTIONS] COMMAND [arg ...

随机推荐

  1. Linux:centOS LAMP搭建之软件包下载地址

    MySQL5.1 wget mysql-5.1.73-linux-i686-glibc23.tar.gz #二进制包 MySQL5.6 wget http://mirrors.sohu.com/mys ...

  2. JS中获取数据库中的值

    在本次项目中,遇到很多问题,经过努力,都逐步得到解决.静下心来,做一个记录,以供以后学习. 在项目中遇到一个问题,需要在JS中读取数据库中的值,然后再把值返回到页面中,解决方案如下:使用Ajax方法来 ...

  3. ubuntu16 jdk7 install&config

    1,下载jdk文件 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521 ...

  4. LitJson 不支持 float 类型数据

    使用指引: 在 Unity 中使用 Best HTTP 插件的 LitJson 发送一些 Json格式数据给服务器,使用方式很简单: string jsonDataPost = JsonMapper. ...

  5. [置顶] Android 关于SP读取与存储正确打开方式?

    一.存储方式分类:SharedPreferences存储 二.SharedPreferences存储 1.特点 ①存储单一数据,例如数值,字符串,布尔 ②文件:/date/date/包名/shared ...

  6. nginx and node.js配合使用 helloworld

    nginx是最好的反向代理服务器. Node.js是... 好吧 ,不介绍了,猛击这里 现在小介绍下怎么用nginx和node.js配合使用. 先写个helloworld.js var http =  ...

  7. MySQL INFORMATION_SCHEMA 使用

    --查看创建的索引的CARDINALITY比率 --通常cardinality达到表数据的10%左右建索引会有意义--如果是一个组合索引,索引第一位的cardinality表示第一个列的cardina ...

  8. OC中使用单例模式

    static Config * instance = nil; +(Config *) Instance { @synchronized(self) { if(nil == instance) { [ ...

  9. swing自定义JDialog弹出框

    第一次搞swing,自定义JDialog的例子较少,写下来备忘 ,对JDialog中的文本框进行了验证 package com.chauvet; import java.awt.Component; ...

  10. 前端(六):JavaScript面向对象之宿主对象

    宿主对象即浏览器提供的对象,主要包括DOM对象和BOM对象. 一.DOM源起 1.SGML.XML和XHTML SGML(标准通用标记语言)是定义使用标签来表示数据的标记语言的语法. - 标签由一个小 ...