`
除了你无可取代
  • 浏览: 148040 次
  • 性别: Icon_minigender_1
  • 来自: 悲鸣洞穴
社区版块
存档分类
最新评论

oracle函数 单表递归查询树

阅读更多

不多讲了,自己试下就知道了。

 

SELECT a.task_id, a.pre_task_id
          FROM pipe_task_rela a
        CONNECT BY a.task_id = PRIOR a.pre_task_id
         START WITH a.task_id = 8 --从枝叶8 递归直到父节点
        
SELECT a.task_id, a.pre_task_id
          FROM pipe_task_rela a
        CONNECT BY PRIOR a.task_id =  a.pre_task_id
         START WITH a.task_id = 1  --从某点开始 递归直到自己和所有子节点

 

表结构如下:

pipe_task_rela   表名字

 

task_id      pre_task_id 

 1                -1
 2                 1
 3                 2
 4                 3
 5                 4
 6                 5
 7                 6
 8                 6
 9                 6
10                -1
11               10

 

 

//=========================下面是同事给的======================

 

 

 

 

select count(*)
  from (select rownum as rn, v.*
          from (select distinct ur.*,
                                (CASE
                                  WHEN se.id = 18 then
                                   1
                                  else
                                   0
                                end) as Related
                  from user_role               ur,
                       SYS_ENTITY_RELATIONSHIP ser,
                       SYS_ENTITY              se
                 where ur.role_id = ser.roleid(+)
                   and ser.entityid = se.id(+)
                 order by Related desc) v)
connect by prior... start with
假设我们现在有如下结构的数据(T_Topic)

TopicID ParentID TopicTitle

1           null          请教Oracle 选取树状数据

2            1            re:请教Oracle 选取树状数据

3            1            其实只要这样就可以

4            1            我也有同样的问题,学习

5            1            顶!

6            5            不要发垃圾贴哦~

7            3            学习ing

8            3            不是Oracle的方法呀

9            6            我喜欢顶,咋地

10          9            封号!

 

 

大家注意看,上面的这些记录其实都是TopicID=1的纪录的相关记录(子记录或者孙记录,总归是后代记录)

我们现在需要使用一条语句选择以TopicID为1记录的全部后代记录,请看下面的SQL:

 

SELECT TopicID,ParentID,TopicTitle FROM T_TOPIC CONNECT BY PRIOR TopicID = ParentID START WITH TopciID = 1

通过这条SQL,我们就可以一次从Table中选取TopiID=1的纪录的全部后代记录及其自身。这条语句的关键部分就是 CONNECT BY PRIOR... START WITH,这句话的标准语法如下

 

SELECT FROM TABLENAME CONNECT BY {PRIOR 列名1 = 列名2 | 列名1 = PRIOR 列名2 } [START WITH];

CONNECT BY 关键字用于设定关联的两个字段,PRIOR 关键字用于设定优先参照字段,START WITH 关键字用于设定切入点。看到这三个关键字的说明,大家一定会想到一个问题,既然可以对不同的字段进行优先参照,那既然可以通过根节点选出其全部的子节点,那么也应该可以通过子节点来选取其全部的祖先节点了,因为PRIOR的优先设定就是在设定其搜索的方向。如果PRIOR设定为自节点优先,则会选取本节点的全部后代节点,反之如果PRIOR设定为父节点优先,就可以逆向得到全部的祖先节点了,还是以上面的数据为例,我们从“封号”这条记录作为切入点,使用如下的SQL

 

SELECT TopicID,ParentID,TopicTitle FROM T_TOPIC CONNECT BY TopicID = PRIOR ParentID START WITH TopicID = 10

我们就能一次性选出如下的数据记录,也就是从“封号”这条记录开始的全部祖先节点

 

TopicID ParentID TopicTitle

10         9            封号!

9           6            我喜欢顶,咋地

6           5           不要发垃圾贴哦~

5          1            顶!

1          null         请教Oracle选取树状数据

 

以上我们就讲解了如何通过一个切入点找到某一个节点的全部后代节点或者全部祖先节点,也许您会说了,我并不需要选取全部,我只要选两层,我的树只允许显示两层。嗯,没错,这也会是常见的需求之一,不过不要紧,我们可以通过加入一个新的关键字 Level ,使用这个关键字,我们就可以控制被选出的关系层。具体的用法,我们还是以第二个SQL需求作为例子,现在假设是需要从“封号”这条数据向上找两层祖先节点出来,该如何操作呢?让我们来看SQL

 

SELECT Topic,ParentID,TopicTitle FROM T_TOPIC WHERE LEVEL <= 3 CONNECT BY TopicID = PRIOR ParentID START WITH TopicID = 10

大家一定注意到了这条SQL中多了这样一段子句 LELVEL <= 3 ,这个就是用来限定选取层级的子句,这条子句就确保了我们可以选取包括节点以及其向上两层祖先节点一共三层节点。LEVEL 这个子句的变化也让你得到一些更加变态[-_-!]的结果,例如我只要取当前节点的祖父节点,那只要将 Level 设定为 Level = 3,去掉一个小于号就能满足一个变态的需求了 LEVEL 除了可以设定为普通的大于、小于、等于、大于等于、小于等于之外,甚至还可以设定为 BETWEEN X AND Y,实在是一个很不错的关键字,可以让我们满足很多变态的需求。

 

 

 

分享到:
评论

相关推荐

    Oracle递归树形结构查询功能

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

    Oracle 递归函数介绍

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

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

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

    数据库设计之递归树查询

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

    Oracle递归查询

    为了更好地理解Oracle中的递归查询,我们首先需要创建一张表格来存储一个简单的树形结构。下面是一张名为`TEST_TREE`的表,包含以下列: - `ID`: 主键,标识每个节点。 - `PID`: 父节点ID,表示当前节点的上一级...

    sql_函数实现三种父子递归

    在SQL中,递归函数是处理层次结构数据的有效方法,特别是在构建树形结构如菜单树或权限树时。本文将探讨如何使用SQL函数实现三种常见的递归查询:找到所有子节点、查找所有父节点以及面包屑导航数据。我们将通过一个...

    Oracle树查询及相关函数

    除了基本的查询语法,Oracle还提供了一些辅助函数来处理树结构,如`SYS_CONNECT_BY_PATH`可以返回节点在整个树路径中的位置,`LEVEL`返回节点在树中的深度,`CONNECT_BY_ROOT`则用于获取树的根节点。 在进行树查询...

    oracle函数大全中文api文档

    "Oracle函数大全中文API文档"是一个非常实用的资源,它提供了对Oracle数据库所有内置函数的详尽解释,帮助开发者和DBA快速理解和使用这些函数。 1. **日期与时间函数**: Oracle提供了处理日期和时间的大量函数,...

    MySQL递归查询

    MySQL 递归查询是指在 MySQL 中实现类似 Oracle Hierarchical Queries 的功能,用于查询树形结构中的所有子节点。由于 MySQL 目前还没有内置的递归查询功能,因此需要使用其他方法来实现。 第一种方法:使用函数来...

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

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

    MySQL多种递归查询方法.docx

    虽然MySQL没有提供类似于Oracle的内置递归查询功能,但通过自定义函数、存储过程等手段,依然可以有效地实现递归查询的需求。 #### 三、其他MySQL相关知识点 除了递归查询之外,文章还提到了以下几个知识点: ###...

    Mysql+Oracle函数文档

    这里,我们主要探讨的是它们的函数用法,通过提供的文档资源——"MySQL_5.1_zh.chm" 和 "oracle函数大全(分类显示).chm",我们可以深入了解这两个数据库系统的函数功能和应用场景。 首先,MySQL 是一款开源、免费的...

    oracle函数大全(分类显示).zip

    以上只列举了一部分Oracle函数,实际中还有很多其他函数,如位操作函数、游标函数、递归函数等。掌握这些函数的用法对于编写高效的SQL查询和存储过程至关重要。"Oracle函数大全(分类显示).chm"文档应该包含了详细的...

    使用over函数实现递归汇总计算

    自 Oracle 8.1.6 版本起,Oracle 数据库引入了分析函数(Analytic Functions),这是一种非常强大的工具,主要用于处理复杂的查询需求,尤其是在计算基于组的聚合值方面表现出色。与传统的聚合函数(如 SUM、AVG 等...

    Oracle函数(chm)

    在Oracle函数中,我们可以找到各种用于处理数据、执行数学计算、进行字符串操作、日期时间处理以及逻辑判断等功能的工具。下面,我们将深入探讨Oracle函数的一些关键知识点。 1. **数学函数**: - `ABS()`: 返回一...

    oracle函数

    在学习和应用Oracle函数时,建议结合实际场景进行练习,理解每个函数的用法和返回值类型,同时注意函数间的相互配合,以解决更复杂的查询需求。通过阅读《oracle+110个常用函数.doc》这样的文档,可以系统地学习和...

    ORACLE函数大全(free)

    本文将详述Oracle函数的各个方面,旨在提供一个全面的Oracle函数参考。 首先,Oracle函数可以分为多种类型,包括数学函数、字符串函数、日期时间函数、转换函数、逻辑运算函数、聚合函数以及系统信息函数等。这些...

    10.2.0.3版本 with改造递归查询

    在Oracle数据库10.2.0.3版本中,用户遇到了使用递归查询时出现的问题:原本应该返回结果的递归查询却未能获取到预期的数据。为了解决这一问题,采用了WITH子句来改造原有的递归查询语句,从而实现了正确的结果展示。...

    %%%oracle函数全.zip

    "Oracle函数大全"这个压缩包文件显然包含了Oracle数据库中常用的函数的详细资料,特别是进行了汉化处理,这对于中文使用者来说是一份非常实用的参考资料。 1. **数学函数**:Oracle提供了各种数学函数,如ABS()用于...

Global site tag (gtag.js) - Google Analytics