Oracle树形结构数据--基本知识

1.数据组成

2.基本查询

2.1.查询某节点及该节点下的所有子孙节点

SELECT   *

     FROM QIANCODE.TREE_TABLE_BASIC T
  START WITH T.ID='111'
CONNECT BY PRIOR  T.ID=T.PID
结果如下所示:
 
注意:若prior关键字缺省:则只能查询到符合条件的起始行,并不进行递归查询;
SELECT  *
    FROM QIANCODE.TREE_TABLE_BASIC T
  START WITH T.ID='111'
CONNECT BY  T.ID=T.PID
结果如下所示:

2.查询某节点及该节点上的所有祖先节点

SELECT   *

     FROM QIANCODE.TREE_TABLE_BASIC T
  START WITH T.ID='111'
CONNECT BY PRIOR T.PID=T.ID;
结果如下图所示:

3.按层级展示某节点下的所有子节点(LEVEL的使用;注意where条件放在start with之前,order by 放最后)

/*在树形结构节点很多的情况一下,一般会采用异步刷新的方式进行,在默认加载的情况下,会展开到某个层级。
这种情况下,不但要获取某个节点的祖先节点,还需要获取祖先节点的兄弟节点,在这种情况下可以通过level进行*/

SELECT  T.ID
              , T.PID
              , T. NAME, LEVEL
    FROM QIANCODE.TREE_TABLE_BASIC T
 WHERE LEVEL >= 1
 START WITH T.ID = '111'
CONNECT BY PRIOR T.ID = T.PID
 ORDER BY LEVEL, ID;
显式结果如下:

注意:level显式的是伪列,是按当前查询出来的结果进行层级排序。

所以这里在原数据中层级为4的班主任在当前查询中level为2.

4.显式出树的级别查询

SELECT    T.ID
                 ,LPAD(T.NAME,LENGTHB(T.NAME)+(LEVEL-1)*4)
                 ,T.PID
                 ,LEVEL
     FROM QIANCODE.TREE_TABLE_BASIC T
  START WITH T.PID='-99999'
CONNECT BY PRIOR T.ID=T.PID;
查询结果如下图所示:

4.1.RPAD()和LPAD()函数的使用

RPAD(string,length,[pad_string])、LPAD(string,length,[pad_string]):从左或往右使用指定的字符串pad_string对string进行填充;
                                                                                                                       pad_string可省略,默认使用空格填充;
                                                                                                                       length表示字符最终返回的总长度。

如下查询:

select   rpad('aabbcc',2,'hh')      from   dual;    --返回 ‘aa’
select   rpad('aabbcc',12,'hh')    from   dual;    --返回 ‘aabbcchhhhhh’

4.2.区别函数lengthb(string)和length(string)

lengthb(string):计算string所占的字节长度:返回字符串的长度,单位是字节。
length(string):计算string所占的字符长度:返回字符串的长度,单位是字符。
 
如下查询:
SELECT LENGTHB('中国') FROM DUAL;   -- 返回 6
SELECT LENGTH('中国') FROM DUAL;     -- 返回 2
对于单字节字符,LENGTHB和LENGTH是一样的.可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文。
注:一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三。

4.3.巧妙利用函数RPAD(),展示更整齐

SELECT   T.ID

                ,RPAD(' ',(LEVEL-1)*4)||T.NAME   AS   name
                ,T.PID,LEVEL
    FROM  QIANCODE.TREE_TABLE_BASIC T
 START WITH T.PID='-99999'
CONNECT BY PRIOR T.ID=T.PID;
查询结果如下:

5.其他常用

SELECT   T.ID
                ,T.NAME
                ,T.PID
                ,CONNECT_BY_ISLEAF                                LEAF               -- 判断是否为叶结点,O否1是
                ,SYS_CONNECT_BY_PATH(T.NAME,'|')       PATH              -- 遍历的路径
                ,CONNECT_BY_ROOT(T.NAME)                   ROOT             -- 遍历根结点         
                 --,CONNECT_BY_ISCYCLE                          ISCYCLE         -- 查询树是否有环路【使用connect_by_iscycle时,必须加上nocycle关键字】
                 ,level                                                               LEVELS           -- 结点所属树的层数
       FROM QIANCODE.TREE_TABLE_BASIC T
 START WITH T.ID='1'
CONNECT BY PRIOR T.ID=T.PID;

 
查询结果如下:
 
特别说明:connect_by_iscycle:伪列,验证这个数是否有环
                  适用情景:验证配置树是否有环,并查出是哪个结点
                 1.修改表数据,使得表数据出现环路
                    update QIANCODE.TREE_TABLE_BASIC T set t.pid='11111' where t.id='1';commit;
                  2.再执行以上connect_by_root()查询语句报错   ——>   ora-01436:“用户数据中的connect by 循环”
出现环路时问题解决如下:
                3.1.检查是哪个结点出现问题【使用connect_by_iscycle时,必须加上nocycle关键字】
                    SELECT    t.id
                                     ,t.name
                                     ,t.pid,connect_by_iscycle
                         FROM QIANCODE.TREE_TABLE_BASIC T
                       START WITH T.ID='1'
                   CONNECT BY nocycle PRIOR t.id=t.pid;
                   查询结果如下:(向下查出id=‘1111’的节点出现环路)
                   
                3.2.根据上面查出的节点id,向上遍历找到问题结点
                   SELECT     t.id
                                     ,t.name
                                     ,t.pid,connect_by_iscycle
                        FROM QIANCODE.TREE_TABLE_BASIC T
                      START WITH T.ID=''
                   CONNECT BY nocycle PRIOR t.pid=t.id;
                    查询结果如下:
                                  即可得出环路出现在id=‘1’和id=‘1111’首尾两个节点
             4.恢复数据
                update QIANCODE.TREE_TABLE_BASIC T set t.pid='-99999' where t.id='1';commit;
 
-------------------------------------------========================更多内容持续更新中=====================================--------------------------------------
 

Oracle树形结构数据-相关知识总结的更多相关文章

  1. Oracle树形结构数据---常见处理情景

    Oracle树形结构数据---常见处理情景 1.查看表数据结构 SELECT *      FROM QIANCODE.TREE_HIS_TABLE T  ORDER BY T.NODE_LEVEL; ...

  2. Oracle DBLINK的相关知识整理

    一.DBLINK(Database Link)概念 dblink,顾名思义就是数据库的链接.当我们要跨本地数据库访问另一个数据库中的表的数据时,在本地数据库中就必须要创建远程数据库的dblink,通过 ...

  3. oracle的DBMS_JOB相关知识

    http://langgufu.iteye.com/blog/1179235 查看当前定时任务 select job,next_date,next_sec,failures,broken from u ...

  4. 数据库相关知识积累(sqlserver、oracle、mysql)

    数据库相关知识积累(sqlserver.oracle.mysql) 1. sqlserver :断开所有连接: (还原数据库) 1.数据库  分离 2. USE master GO ALTER DAT ...

  5. oracle 树形SQL

    oracle树形sql查询实例分析   通过此SQL语句  [sql] select  * from tree    查看原始数据如下:     我们要想得到如下的一个树形查询结果如下图所示(包含 R ...

  6. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  7. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  8. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  9. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

随机推荐

  1. vue-cli脚手架之其他文件解释

    好了,脚手架目录中重要的文件基本都介绍了,但还有一个不太注意到的文件没有解释,这里也说明一下. config文件夹下的index.js,作用是不同开发环境下的参数配置(可选项很多,生产环境.开发环境. ...

  2. Storm Flow

    A Stream represents the core data model in Trident, and can be thought of as a "stream" of ...

  3. linux多线程编程——读者优先、写者优先问题

    读者优先描述 如果读者来: 1) 无读者.写着,新读者可以读: 2) 无写者等待,但有其他读者正在读,新读者可以读: 3) 有写者等待,但有其他读者正在读,新读者可以读: 4) 有写者写,新读者等 如 ...

  4. linux父子进程问题

    今天遇到一个linux进程启动时指定Max open files不对的问题,导致程序建立socket异常,进而导致fullgc问题,影响正常服务.所以顺带又温习了下linux下的父子进程的特性. 孤儿 ...

  5. 使用Idea搭建Spring Boot环境

    1.基本安装配置 IntelliJ IDEA搭建SpringBoot的小Demo SpringBoot+IDEA+Maven快速入门 2.

  6. 零零碎碎的java知识:static属性、普通属性、static代码块、普通代码块、构造函数

    本文中结论仅经本机测试,不保证在别的环境下成立.如果有什么不成立的地方务必告诉我_(:_」∠)_ java的内存是动态分配的,其机制和c/c++相当不一样……emmm在此不表. static: ·st ...

  7. Linux(centos7)安装maven3.5

    1.创建一个maven文件夹 [root@MiWiFi-R3-srv ~]# mkdir /usr/local/maven 1 2.上传apache-maven-3.5.0-bin.tar.gz到/u ...

  8. 如何向数据库中添加TIMESTAMP(6)类型的数据

    to_timestamp('2011-11-11 11:11:11.1','yyyy-mm-dd hh24:mi:ss.ff')

  9. Google play billing(Google play 内支付) 下篇

    开篇: 如billing开发文档所说,要在你的应用中实现In-app Billing只需要完成以下几步就可以了. 第一,把你上篇下载的AIDL文件添加到你的工程里,第二,把 <uses-perm ...

  10. 个人Hadoop编程代码记录

    **WordCount package cn.cpl.recom; import java.io.IOException; import java.util.StringTokenizer; impo ...