`
除了你无可取代
  • 浏览: 144340 次
  • 性别: 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 递归函数介绍

    Oracle_详解分析函数

    详解Oracle分析函数,主用于OLAP,以实例讲解分析函数. 如: 排序用Rank, Dense_rank, row_number 1.带空值的排列 2.Top/Bottom N查询 3.First/Last排名查询 4.按层次查询 1.窗口函数简介 2.窗口函数示例-全统计 3....

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

    主要给大家介绍了关于Oracle如何通过递归查询父子兄弟节点的相关资料,递归查询对各位程序员来说应该都不陌生,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

    MySQL多种递归查询方法.docx

    Oracle 递归查询, start with connect by prior 用法 find_in_set 函数 concat,concat_ws,group_concat 函数 MySQL 自定义函数 手动实现 MySQL 递归查询 Oracle 递归查询 在 Oracle 中是通过 start ...

    Mysql树形递归查询的实现方法

    对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的...

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

    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

    Oracle递归树形结构查询功能

    oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。 概要:树状结构通常由根节点、父节点、子节点和叶节点组成,简单来说,一张表中存在两个字段...

    Oracle 11GR2的递归WITH子查询方法

    下面给大家详细介绍Oracle 11GR2的递归WITH子查询方法,具体内容如下所示: SQL&gt; with emp_data(ename,empno,mgr,l) as (select ename, empno, mgr, 1 lvl from emp where mgr is null union all select emp....

    oracle语法.rar

    内含很多oracle的语法和常用函数,包括 对于oracle进行简单树查询(递归查询),oracle内置函数大全, PLSQL 编程手册(SQL大全),及分页建表等很多学习资料。

    oracle数据库函数及其使用实例.sql

    该脚本包含递归查询、删除数据表中重复数据、分组取最大记录,行列互转、多行合并等不常见但是非常实用的oracle函数并附带详细的实例持续更新中

    oracle的开发技术

    oracle的编成规范、开发工具、分组、类型转换、排序函数、统计函数、层次查询、管道函数、递归查询、动态sql

    oracle的sql优化

     *存在递归查询情况如果关联Table太多对性能会造成较大影响,往往推荐采用临时表转为分步骤操作提高性能  *尽量使用表关联查询而不使用函数,但涉及类似于代码表要重复关联多次取数据问题时候又适合使用函数

    《剑破冰山__Oracle开发艺术_》高清PDF

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part10

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    MySQL递归查询树状表的子节点、父节点具体实现

    简介:mysql5.0.94版本,该版本以及较高级的版本(5.5、6等等)尚未支持循环递归查询,和sqlserver、oracle相比,mysql难于在树状表中层层遍历的子节点。本程序重点参考了下面的资料,写了两个sql存储过程,子节点...

    剑破冰山++Oracle开发艺术[1].part01

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part07

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part04

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part02

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

Global site tag (gtag.js) - Google Analytics