`
阅读更多

Oracle递归查询,Oracle树查询,Oracle START WITH查询

 

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

©Copyright 蕃薯耀 2018年5月14日

http://fanshuyao.iteye.com/

 

说明:

现在表(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日

http://fanshuyao.iteye.com/

  • 大小: 4 KB
  • 大小: 2.5 KB
  • 大小: 9.4 KB
  • 大小: 1.7 KB
  • 大小: 11.1 KB
  • 大小: 5.8 KB
1
0
分享到:
评论
1 楼 蕃薯耀 2018-05-14  
Oracle递归查询
Oracle树查询
Oracle START WITH查询
Oracle START WITH……CONNECT BY查询
Oracle WM_CONCAT查询

=========
蕃薯耀

相关推荐

    Oracle递归树形结构查询功能

    Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...

    递归查询菜单树,支持mysql,oracle

    这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的数据库系统中的实现。 首先,我们要理解什么是递归查询。递归查询是一种在数据库中处理层次数据的方法,它通过自身...

    oracle递归、迭代

    在Oracle中实现递归查询需要用到`START WITH... CONNECT BY PRIOR`语法。 #### 三、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH start_condition ...

    oracle递归查询的例子

    - **START WITH 子句**:这里指定了递归查询的起点,即当 `relation` 字段值为 `1` 的记录作为根节点开始查询。 - **CONNECT BY PRIOR 子句**:定义了递归关系。在这里,`PRIOR id` 表示当前记录的父节点(上一级)...

    Oracle 递归函数介绍

    1. 树形结构查询:递归函数可以用来查询树形结构的每个节点,例如组织结构、目录结构等。 2. 递归计算:递归函数可以用来进行递归计算,例如计算 factorial、斐波那契数列等。 3. XML 处理:递归函数可以用来处理 ...

    Oracle递归查询

    ### Oracle递归查询详解 #### 一、引言 在处理具有层级结构的数据时,递归查询是一项非常有用的技能。例如,在处理组织架构、产品分类等数据时,我们经常需要查询某一节点及其所有子节点或者从某个节点追溯到其根...

    Oracle递归SQL学习

    这是Oracle递归查询的关键部分。`connect by`子句定义了层次之间的连接规则。在这里,`prior`关键字用来引用上一层的值,即父节点的`parent_id`应该等于当前行的`id`,这样我们就沿着父到子的方向遍历树。 3. `...

    dhtmlx tree 使用,与oracle递归查询的结合

    这个文件可能包含了用于从Oracle数据库中获取树形结构数据的SQL查询语句,其中可能使用了`CONNECT BY`或`START WITH`等关键字来实现递归。分析这个文件的内容可以帮助我们了解如何构建适合dhtmlx Tree的递归查询。 ...

    数据库设计之递归树查询

    `WITH`语句配合递归选项,可以实现递归查询,非常适合处理树形结构数据。 三、`WITH RECURSIVE`语法 在支持`WITH RECURSIVE`的数据库(如PostgreSQL、SQL Server)中,递归查询的通用语法如下: ```sql WITH ...

    Oracle中的树状查询(递归查询)

    Oracle数据库系统在处理层次数据或树形结构时,提供了强大的工具——递归查询。递归查询允许我们在数据表中处理嵌套级别的数据,这在权限查询、组织结构、产品分类等场景中尤其常见。本文将深入探讨Oracle中的树状...

    Oracle start with.connect by prior子句实现递归查询

    ### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...

    深入sql oracle递归查询

    Oracle数据库系统提供了两种主要的递归查询方法:一种是使用`WITH`子句配合`UNION ALL`,另一种是使用`START WITH`和`CONNECT BY`。这两种方法都能解决查询层次关系的问题,例如找出某个节点的所有子节点或父节点。 ...

    在db2和oracle中的对树的递归查询语句

    在Oracle中,对树的递归查询主要依赖于`CONNECT_BY`功能。`CONNECT_BY`是Oracle SQL的一个扩展,用于处理层次查询。它允许我们通过指定的连接条件来遍历层级数据,从而进行递归查询。例如,我们可以用以下方式查询一...

    在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现.pdf

    在数据库系统中实现树结构表递归查询是一种常见的需求,它允许我们查询出具有层级关系的数据。ORACLE、MSSQL(Microsoft SQL Server)、MYSQL是三大主流数据库系统,它们各自提供了不同的方式来实现递归查询。 首先...

    Oracle通过递归查询父子兄弟节点方法示例

    在Oracle数据库中,递归查询是一种强大的工具,用于处理层级数据结构,如组织结构、文件系统或树形关系。在本篇文章中,我们将探讨如何利用递归查询来查找父子兄弟节点,这对于理解和处理这类关系非常关键。 首先,...

    oracle菜单树查询

    oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询

    Oracle查询树形结构

    在 Oracle 中,查询树形结构可以使用 START WITH...CONNECT BY PRIOR 子句实现递归查询。其基本语法是: SELECT * FROM tablename START WITH cond1 CONNECT BY cond2 WHERE cond3; 其中,COND1 是根结点的限定...

    MySQL多种递归查询方法.docx

    在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...

    10.2.0.3版本 with改造递归查询

    Oracle数据库支持通过`CONNECT BY`和`START WITH`子句实现递归查询。递归查询通常用于处理层次结构数据,如组织结构、文件系统等。 ##### 2. WITH子句 WITH子句是Oracle SQL中的一个特性,它允许用户定义一个临时...

Global site tag (gtag.js) - Google Analytics