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. CentOS7下开启端口

    开启端口: firewall-cmd --zone=public --add-port=80/tcp --permanent 含义: --zone #作用域 --add-port=80/tcp #添加 ...

  2. Mybatis学习随笔

    学习Mybatis路径(适合有java基础和mysql基础的小伙伴) 1.把项目搭建起来,跑一跑感受一下 2.测试基本映射 3.测试高级映射 4.测试动态sql 5.学习懒加载与缓存 6.与sprin ...

  3. 纯css面板插件,自适应,多样式

    最近在做公司的系统后台,用的bootstrap,在设计布局的时候不喜欢他的面板,所以自己写了这个面板插件,分享给大家 先上预览图: 默认样式: 绿色: 黄色: 蓝: 红: 使用方法: 引用MoUi.c ...

  4. Idea15 常用设置(一):JDK、SVN

      1:显示行号  File->Settings->General->Appearance 2: 代码自动补齐即使是小写字母也会弹出代码补齐提示     3:自动编译 设置 4: 设 ...

  5. 九、background及相关所有属性

    先看看如下所示的视效图应该如何显示背景阴影? #header { height: 180px; background: url(../images./bg.png) no-repeat center ...

  6. 斐波那契数列(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 1. 写一个函数,输入 n, 求斐波那契(Fibonacci ...

  7. python链接安卓 跳一跳

    借鉴:  一百行代码实现微信跳一跳 之前需要安装adb 开启服务: adb nodaemon server 显示设备: adb devices 代码: import math import os im ...

  8. yii 只查询指定字段

    $cri = new CDBcriteria(); $cri->addCondition( ' hid = '.$hid.' ' ); $cri->select = 'id,propert ...

  9. java Date中方法toLocaleString过时的替代方案

    DateFormat ddf = DateFormat.getDateInstance(); DateFormat dtf = DateFormat.getTimeInstance(); DateFo ...

  10. request.getRequestDispatcher().forward(request.response)

    request.getRequestDispatcher().forward(request.response)中的那两个参数是哪里来的? 2010-11-09 23:13 QQ357169111 | ...