Oracle递归查询,Oracle START WITH……CONNECT BY查询
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为空,数据结构例子如下:
- 专业设施名称 > 公共服务设施 > 特殊设施
现在要根据CODE_ID查询出完整的树结构名称,通过大于号(>)拼接起来,如上面所示。
一、方法一:使用START WITH……CONNECT BY查询,再使用SYS_CONNECT_BY_PATH拼接
- SELECT CC.*,SUBSTR(SYS_CONNECT_BY_PATH(CC.CODE_NAME, '>'),2) TREE_PATH
- FROM CMM_CODE CC
- START WITH CC.Code_Id='pn_0501004'
- CONNECT BY PRIOR CC.PARENT_CODE_ID= CC.CODE_ID --此处PARENT_CODE_ID和CODE_ID顺序受PRIOR影响
- ;
SYS_CONNECT_BY_PATH : 和父结构名称拼接
SUBSTR : 去除最前面的大于号(>)
CONNECT BY PRIOR :需要注意的是PRIOR 的顺序
- CONNECT BY PRIOR CC.PARENT_CODE_ID= CC.CODE_ID
和
- CONNECT BY CC.PARENT_CODE_ID= PRIOR CC.CODE_ID
查询出来的数据是不一样。
上面sql查询结果如下:


查询出来的数据为3条是对的,但查询出来的数据不能再进行第二次的过滤查询,会报错,如:
- SELECT * FROM (
- SELECT CC.*,SUBSTR(SYS_CONNECT_BY_PATH(CC.CODE_NAME, '>'),2) TREE_PATH
- FROM CMM_CODE CC
- START WITH CC.Code_Id='pn_0501004'
- CONNECT BY PRIOR CC.PARENT_CODE_ID= CC.CODE_ID--此处 PARENT_CODE_ID和CODE_ID顺序受PRIOR影响
- ) TEMP WHER TEMPCODE_ID='pn_0500000'
- ;

而且查询出来的结构顺序是相反的,如下:
- 特殊设施>公共服务设施>专业设施名称
方法二:使用WM_CONCAT函数进行拼接
- --TO_CHAR是为了将clob转成一般字符类型
- --REPLACE是将逗号(,)改成大于号(>)
- --WM_CONCAT字符串拼接,默认是使用逗号(,)拼接
- --查询结果:专业设施名称 > 公共服务设施 > 特殊设施
- SELECT TO_CHAR(REPLACE(WM_CONCAT(TEMP.CODE_NAME), ',', ' > ')) TREE_PATH FROM(
- SELECT CC.*
- FROM CMM_CODE CC
- START WITH CC.Code_Id='pn_0501004'
- CONNECT BY PRIOR CC.PARENT_CODE_ID=CC.CODE_ID
- ORDER BY CC.ORDER_NUMBER
- )TEMP
- ;
查询结果如下:
- 专业设施名称 > 公共服务设施 > 特殊设施
结果顺序正确,但一样是不能关联其它的表进行查询。因为START WITH 后面必须加上具体的条件,不能使用关联的的字段。
方式三:START WITH关联查询
- select info.*,
- CC.CODE_NAME,SUBSTR(TEMP_TABLE.TREE_PATH, 4) TREE_PATH
- from pn_place_name info
- LEFT JOIN CMM_CODE CC ON CC.CODE_ID=INFO.CMM_CODE_ID
- LEFT JOIN (
- SELECT code.*,SYS_CONNECT_BY_PATH(code.CODE_NAME, ' > ') TREE_PATH
- FROM CMM_CODE code
- START WITH code.PARENT_CODE_ID IS NULL AND code.CLASS_CODE='PN_TYPE_NEW'
- CONNECT BY PRIOR code.CODE_ID= code.PARENT_CODE_ID
- ) TEMP_TABLE ON TEMP_TABLE.CODE_ID=INFO.CMM_CODE_ID
- where 1=1 and info.ISINSPECTOPINION is null
- AND info.PN_NO='106737'
- ;
SUBSTR(TEMP_TABLE.TREE_PATH, 4):去掉最前面的 空格 + 大于号(>)+ 空格
- ' > '
方法三和方法二的区别在于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查询的更多相关文章
- Oracle递归查询(start with…connect by prior)
查询基本结构: select … from table_name start with 条件1 connect by 条件2 1.建测试用表 create table test ...
- Oracle 递归查询 (start with ...connect by ...prior)
1.connect by 是结构化查询中用到的,其基本语法是:select … from tablename start with 条件1connect by 条件2where 条件3;例:selec ...
- Oracle递归查询start with connect by prior
一.基本语法 connect by递归查询基本语法是: select 1 from 表格 start with ... connect by prior id = pId start with:表示以 ...
- 【转载】Oracle递归查询:使用prior实现树操作【本文出自叶德华博客】
本文标题:Oracle递归查询:使用prior实现树操作 本文链接:http://yedward.net/?id=41 本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处. Oracle ...
- Oracle学习之start with...connect by子句的用法
转自:http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多谢博主分享 Oracle中start with…connect by ...
- [转]ORACLE递归查询
转自:http://www.oracle.com/technetwork/cn/articles/hartley-recursive-086819-zhs.html 递归数据库处理,也称为材料清单 或 ...
- Oracle递归查询与常用分析函数
最近学习oracle的一些知识,发现自己sql还是很薄弱,需要继续学习,现在总结一下哈. (1)oracle递归查询 start with ... connect by prior ,至于是否向上查 ...
- oracle中start with和connect by的用法理解
转自:https://blog.csdn.net/qq_29274091/article/details/72627350 Oracle中start with和connect by 用法理解转自:ht ...
- 【2016-11-7】【坚持学习】【Day22】【Oracle 递归查询】
直接在oracle 递归查询语句 select * from groups start with id=:DeptId connect by prior superiorid =id 往下找 sele ...
随机推荐
- java基础知识总结--对象的克隆
前提:在Java语言中所有的类的都是缺省的继承Java语言中的Object类的, protected native Object clone() throws CloneNotSupportedExc ...
- Mybatis批量插入返回自增主键(转)
我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:useGenerateKeys和keyProperty. 2.不支持生成自增主键的数据库:< ...
- 通过DCGAN进行生成花朵
环境是你要安装Keras和Tensorflow 先来个network.py,里面定义了生成器网络和鉴别器网络: # -*- coding: UTF-8 -*- """ D ...
- 也谈谈我对Docker的简单理解
Docker能解决什么问题呢?一个工具的出现必然需要解决一些问题,Docker也不例外,简单说说我们常见的2种情况Docker是如何解决的吧.1.程序在我这跑得好好的,在你那怎么就不行呢?!这是一个典 ...
- Docker搭建镜像仓库和配置缓冲地点
Docker搭建镜像仓库和配置缓冲地点 参考网址:https://docs.docker.com/engine/reference/commandline/dockerd/#options 一.配置D ...
- InfluxDB添加新服务
操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 这里以添加 syncd 服务为例记录下InfluxDB添加新服务 ...
- 干货!最全羽毛球技术动态分解gif图
羽毛球的技术千变万化,但是离不开最基本的击球方法.下面通过一组形象的动态图,给你展现羽毛球的基本动作.大家,务必要收藏起来,慢慢体会哦! 一.发球 二.前场技术 1.网前球 2.搓球 3.勾球 4.推 ...
- SuperObject生成示例
var jo,jEntity,jSubEntity: ISuperObject; jaOrder,jaEntity,jaSubEntity: ISuperObject; i,j,entityCount ...
- ffmpeg 、Vlc参数
ffmpeg.exe -loglevel error -probesize 32 -vsync passthrough -framerate 20 -f gdigrab -i desktop -fil ...
- Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 2)
在我们设计和开发应用程序时,经常要用到控件.比如开发一个客户端WinForm应用程序时,微软就为我们提供了若干控件,这些控件为我们提供了可被定制的属性和事件.属性可以更改它的外观,比如背景色,标题等, ...