度量快速开发平台-专业、快速的软件定制快开平台

标题: oracle树查询(续2) [打印本页]

作者: fteair    时间: 2020-2-14 19:18

作者: 张兴康    时间: 2020-2-15 14:39
fteair 发表于 2017-3-14 19:18


作者: caixuqad    时间: 2020-5-6 17:29

作者: 张兴康    时间: 2020-6-18 13:45
标题: oracle树查询(续2)
9.查询一个节点的父节点的同级节点(族叔)。

WITH tmp AS  
(SELECT      a.*, LEVEL lev   
     FROM flfl a   
    START WITH a.sjflid IS NULL  
  CONNECT BY a.sjflid = PRIOR a.ID)   
  SELECT *   
  FROM tmp   
  WHERE lev = (SELECT lev   
        FROM tmp   
  WHERE ID = 819394) - 1  
      只需要做个级别判断就成了。

      基本上,常见的查询在里面了,不常见的也有部分了。其中,查询的内容都是节点的基本信息,都是数据表中的基本字段,但是在树查询中还有些特殊需求,是对查询数据进行了处理的,常见的包括列出树路径等。

      补充一个概念,对于数据库来说,根节点并不一定是在数据库中设计的顶级节点,对于数据库来说,根节点就是start with开始的地方。

      下面列出的是一些与树相关的特殊需求。

      10.名称要列出名称全部路径。

      这里常见的有两种情况,一种是是从顶级列出,直到当前节点的名称(或者其它属性);一种是从当前节点列出,直到顶级节点的名称(或其它属性)。举地址为例:国内的习惯是从省开始、到市、到县、到居委会的,而国外的习惯正好相反(老师说的,还没接过国外的邮件,谁能寄个瞅瞅 )。

从顶部开始:

    SELECT      SYS_CONNECT_BY_PATH (mc, '/')   
          FROM flfl   
        WHERE ID = 6498   
    START WITH sjflid IS NULL  
    CONNECT BY sjflid = PRIOR ID;  


从当前节点开始:
    SELECT      SYS_CONNECT_BY_PATH (mc, '/')   
         FROM flfl   
   START WITH ID = 6498   
    CONNECT BY PRIOR sjflid = ID;  
      在这里我又不得不放个牢骚了。oracle只提供了一个sys_connect_by_path函数,却忘了字符串的连接的顺序。在上面的例子中,第一个SQL是从根节点开始遍历,而第二个SQL是直接找到当前节点,从效率上来说已经是千差万别,更关键的是第一个SQL只能选择一个节点,而第二个SQL却是遍历出了一颗树来。再次PS一下。

      sys_connect_by_path函数就是从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串,这个功能还是很强大的。

      11.列出当前节点的根节点。

      在前面说过,根节点就是start with开始的地方。

   SELECT      CONNECT_BY_ROOT mc, flfl.*   
         FROM flfl   
   START WITH ID = 6498   
   CONNECT BY PRIOR sjflid = ID;  
      connect_by_root函数用来列的前面,记录的是当前节点的根节点的内容。

      12.列出当前节点是否为叶子。

      这个比较常见,尤其在动态目录中,在查出的内容是否还有下级节点时,这个函数是很适用的。

Sql代码
1.     SELECT      CONNECT_BY_ISLEAF, flfl.*   
2.           FROM flfl   
3.     START WITH sjflid IS NULL  
4.     CONNECT BY sjflid = PRIOR ID;  
      connect_by_isleaf函数用来判断当前节点是否包含下级节点,如果包含的话,说明不是叶子节点,这里返回0;反之,如果不包含下级节点,这里返回1。


作者: 张兴康    时间: 2020-6-18 13:45

作者: 张兴康    时间: 2020-6-18 13:46

作者: 陈晓龙    时间: 2020-6-18 14:13

作者: 陈晓龙    时间: 2020-6-18 14:14

作者: 陈晓龙    时间: 2020-6-18 14:15

作者: 张兴康    时间: 2020-6-19 13:48
陈晓龙 发表于 2017-1-18 14:15


作者: 陈晓龙    时间: 2020-6-19 14:02
张兴康 发表于 2017-1-19 13:48


作者: 张兴康    时间: 2020-6-20 15:07
终帖




欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) Powered by Discuz! X3.2