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. easyui numberbox 输入框禁止输入

    { field: 'Amount', title: '金额', width: 80, editor: { type: 'numberbox', options: { disabled: true, p ...

  2. MySQL数据库(2)----检索信息

    SELECT 语句的简化语法如下: SELECT what to retrive FROM table or tables WHERE conditions that data must satisf ...

  3. How to use Log4cplus

    Introduction Log4cplus is derived by the popular Log4j written in java.<br>This tutorial show ...

  4. Python爬虫教程-29-验证码识别-Tesseract-OCR

    本篇是关于验证码识别问题,也是Python爬虫笔记的一个结尾,使用 Tesseract Python爬虫教程-29-验证码识别-Tesseract-OCR 常见反爬虫手段: 验证码 1.简单图片,扭曲 ...

  5. push本地代码到github发生错误的解决办法

    有一天,我在github上编写好了README.md这个文件,接着发现本地有段代码忘记上传了,于是熟练的输入git add .   git commit -m "modify",以 ...

  6. 第四次作业-第一次scrum冲刺

    团队成员 周斌 舒 溢 许嘉荣 唐 浩 黄欣欣 1.第一次冲刺任务安排 对Github上的HUSTOJ开源项目进行Fork,搭建基本环境 2.用户需求 ①基本功能显示在首页 ②能够提交题目并判题,并对 ...

  7. 如何编写自定义hive UDF函数

    Hive可以允许用户编写自己定义的函数UDF,来在查询中使用.Hive中有3种UDF: UDF:操作单个数据行,产生单个数据行: UDAF:操作多个数据行,产生一个数据行. UDTF:操作一个数据行, ...

  8. metasploit 连接database相关问题

    我们首先去这个目录下看database.yml文件内容: 下图是我们看到的的信息 接着打开metasploit,运行db_connect 指令链接数据库.格式为: db_connect 用户名:密码@ ...

  9. HTML 水平线hr

    HTML 水平线 <hr /> 标签在 HTML 页面中创建水平线. hr 元素可用于分隔内容. 实例 <p>This is a paragraph</p> < ...

  10. [问题记录]cocos2dx编译打包apk过程&问题记录

    目录: 1. 入门 2. 编译 3. 问题 4. 总结 5. 参考 ------------------------------------------------------------------ ...