设为首页 收藏本站
查看: 952|回复: 0

[经验分享] oracle函数 单表递归查询树

[复制链接]

尚未签到

发表于 2016-7-26 08:36:23 | 显示全部楼层 |阅读模式
  不多讲了,自己试下就知道了。
  
  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,实在是一个很不错的关键字,可以让我们满足很多变态的需求。
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249390-1-1.html 上篇帖子: Oracle中的时间查询和分页 下篇帖子: Oracle EBS 开发小贴士
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表