Oracle递归查询,Oracle START WITH……CONNECT BY查询,Oracle树查询

================================

©Copyright 蕃薯耀 2018年5月14日

https://www.cnblogs.com/fanshuyao/

说明:

现在表(CMM_CODE)中有一批树结构的数据,主键为CODE_ID,以字段PARENT_CODE_ID作为父结构关联,最顶层结构的PARENT_CODE_ID为空,数据结构例子如下:

  1. 专业设施名称 > 公共服务设施 > 特殊设施

现在要根据CODE_ID查询出完整的树结构名称,通过大于号(>)拼接起来,如上面所示。

一、方法一:使用START WITH……CONNECT BY查询,再使用SYS_CONNECT_BY_PATH拼接

  1. SELECT CC.*,SUBSTR(SYS_CONNECT_BY_PATH(CC.CODE_NAME, '>'),2) TREE_PATH
  2. FROM CMM_CODE CC
  3. START WITH CC.Code_Id='pn_0501004'
  4. CONNECT BY PRIOR CC.PARENT_CODE_ID= CC.CODE_ID --此处PARENT_CODE_ID和CODE_ID顺序受PRIOR影响
  5. ;

SYS_CONNECT_BY_PATH : 和父结构名称拼接

SUBSTR : 去除最前面的大于号(>)

CONNECT BY PRIOR :需要注意的是PRIOR 的顺序

  1. CONNECT BY PRIOR CC.PARENT_CODE_ID= CC.CODE_ID

  1. CONNECT BY CC.PARENT_CODE_ID= PRIOR  CC.CODE_ID

查询出来的数据是不一样。

上面sql查询结果如下:


 

 查询出来的数据为3条是对的,但查询出来的数据不能再进行第二次的过滤查询,会报错,如:

  1. SELECT * FROM (
  2. SELECT CC.*,SUBSTR(SYS_CONNECT_BY_PATH(CC.CODE_NAME,     '>'),2) TREE_PATH
  3. FROM CMM_CODE CC
  4. START WITH CC.Code_Id='pn_0501004'
  5. CONNECT BY PRIOR CC.PARENT_CODE_ID= CC.CODE_ID--此处    PARENT_CODE_ID和CODE_ID顺序受PRIOR影响
  6. ) TEMP WHER TEMPCODE_ID='pn_0500000'
  7. ;

而且查询出来的结构顺序是相反的,如下:

  1. 特殊设施>公共服务设施>专业设施名称

方法二:使用WM_CONCAT函数进行拼接

  1. --TO_CHAR是为了将clob转成一般字符类型
  2. --REPLACE是将逗号(,)改成大于号(>)
  3. --WM_CONCAT字符串拼接,默认是使用逗号(,)拼接
  4. --查询结果:专业设施名称 > 公共服务设施 > 特殊设施
  5. SELECT TO_CHAR(REPLACE(WM_CONCAT(TEMP.CODE_NAME), ',', ' > ')) TREE_PATH FROM(
  6. SELECT CC.*
  7. FROM CMM_CODE CC
  8. START WITH CC.Code_Id='pn_0501004'
  9. CONNECT BY PRIOR CC.PARENT_CODE_ID=CC.CODE_ID
  10. ORDER BY CC.ORDER_NUMBER
  11. )TEMP
  12. ;

查询结果如下:

  1. 专业设施名称 > 公共服务设施 > 特殊设施

结果顺序正确,但一样是不能关联其它的表进行查询。因为START WITH 后面必须加上具体的条件,不能使用关联的的字段。

方式三:START WITH关联查询

  1. select info.*,
  2. CC.CODE_NAME,SUBSTR(TEMP_TABLE.TREE_PATH, 4) TREE_PATH
  3. from pn_place_name info
  4. LEFT JOIN CMM_CODE CC ON CC.CODE_ID=INFO.CMM_CODE_ID
  5. LEFT JOIN (
  6. SELECT code.*,SYS_CONNECT_BY_PATH(code.CODE_NAME, ' > ') TREE_PATH
  7. FROM CMM_CODE  code
  8. START WITH code.PARENT_CODE_ID IS NULL AND code.CLASS_CODE='PN_TYPE_NEW'
  9. CONNECT BY PRIOR code.CODE_ID= code.PARENT_CODE_ID
  10. ) TEMP_TABLE ON TEMP_TABLE.CODE_ID=INFO.CMM_CODE_ID
  11. where 1=1 and info.ISINSPECTOPINION is null
  12. AND info.PN_NO='106737'
  13. ;

SUBSTR(TEMP_TABLE.TREE_PATH, 4):去掉最前面的 空格 + 大于号(>)+ 空格

  1. ' > '

方法三和方法二的区别在于START WITH 后面的条件,和

CONNECT BY PRIOR code.CODE_ID= code.PARENT_CODE_ID

的条件,此处的顺序是不一样的。

方法三是把所有PARENT_CODE_ID IS NULL 的数据都取出来,即把最顶层的结构都先取出来,再去关联子结构,取出来的数据是所有的。唯一的好处是可以关联其它表进行查询。

结果:

知道具体的id值,并且是单条数据查询,不需要关联表时,使用方式二。

需要关联表查询时,使用方式三。

================================

©Copyright 蕃薯耀 2018年5月14日

https://www.cnblogs.com/fanshuyao/

Oracle递归查询,Oracle START WITH……CONNECT BY查询的更多相关文章

  1. Oracle递归查询(start with…connect by prior)

    查询基本结构: select … from table_name       start with 条件1       connect by 条件2 1.建测试用表 create table test ...

  2. Oracle 递归查询 (start with ...connect by ...prior)

    1.connect by 是结构化查询中用到的,其基本语法是:select … from tablename start with 条件1connect by 条件2where 条件3;例:selec ...

  3. Oracle递归查询start with connect by prior

    一.基本语法 connect by递归查询基本语法是: select 1 from 表格 start with ... connect by prior id = pId start with:表示以 ...

  4. 【转载】Oracle递归查询:使用prior实现树操作【本文出自叶德华博客】

    本文标题:Oracle递归查询:使用prior实现树操作 本文链接:http://yedward.net/?id=41 本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处. Oracle ...

  5. Oracle学习之start with...connect by子句的用法

    转自:http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多谢博主分享 Oracle中start with…connect by ...

  6. [转]ORACLE递归查询

    转自:http://www.oracle.com/technetwork/cn/articles/hartley-recursive-086819-zhs.html 递归数据库处理,也称为材料清单 或 ...

  7. Oracle递归查询与常用分析函数

    最近学习oracle的一些知识,发现自己sql还是很薄弱,需要继续学习,现在总结一下哈. (1)oracle递归查询  start with ... connect by prior ,至于是否向上查 ...

  8. oracle中start with和connect by的用法理解

    转自:https://blog.csdn.net/qq_29274091/article/details/72627350 Oracle中start with和connect by 用法理解转自:ht ...

  9. 【2016-11-7】【坚持学习】【Day22】【Oracle 递归查询】

    直接在oracle 递归查询语句 select * from groups start with id=:DeptId connect by prior superiorid =id 往下找 sele ...

随机推荐

  1. Flask CBV

    from flask import Flask, views import time app = Flask(__name__) def zhuangshiqi(func): def inner(*a ...

  2. Flask jinja2

    {{ }} #引用 执行 非逻辑代码 {% %} #逻辑代码 引用变量 @app.template_global() # 全局函数 Markup # 安全标签字符串儿 {% macro func() ...

  3. session与cookie的区别是什么?如果客户端禁用了cookie功能,将会对session有什么影响?

    cookie 和session 的区别: a.cookie数据存放在客户的浏览器上,session数据放在服务器上. b.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE ...

  4. 【搜索】传感器 @upcexam6023

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 SR最近新买了一款电子桌游 这个玩具内部是M个围成一圈的传感器.每个传感器都有开和关两种工作状态,分别用1和0表示.显然,从不同的位置触发沿 ...

  5. JAVA自学笔记06

    JAVA自学笔记06 1.二维数组 1)格式: ①数据类型[][]数组名 = new 数据类型[m][n]; 或 数据类型[]数组名[]=new 数据类型[m][n]; m表示这个二维数组有多少个一维 ...

  6. pygame 笔记-7 生命值/血条处理

    通常游戏中的角色都有所谓的生命值,而且头顶上会有一个血条显示.生命值无非就是一个属性而已,很容易在Player.py类中增加,头顶上的血条其实就是绘制二个矩形,叠加在一起. 以上节的Player.py ...

  7. Deepin 15.4 编译安装 LNMP(PHP 5.6.31 + Nginx 1.12.1 + MySQL 5.6.36)

    先查看先前的文章:Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记 编译 Nginx #安装依赖库 sudo apt-get -y i ...

  8. Oracle创建Database Link

    一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方 ...

  9. netty源码解析目录

    第一章 java nio三大组件与使用姿势 二.netty使用姿势 三.netty服务端启动源码 四.netty客户端启动源码 五.NioEventLoop与netty线程模型 六.ChannelPi ...

  10. android:第十章,后台的默默劳动者——服务,学习笔记

    一.多线程 1)本章首先介绍了安卓的多线程编程,说明在子线程中如果要修改UI,必须通过Handler, Message, MessageQueue, Looper来实现,但是这样毕竟太麻烦了.  2) ...