博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle Start With的用法
阅读量:4102 次
发布时间:2019-05-25

本文共 3556 字,大约阅读时间需要 11 分钟。

Start With (树查询)

问题描述:

在数据库中, 有一种比较常见得 设计模式, 层级结构 设计模式, 具体到 Oracle table中, 字段特点如下:

ID, DSC, PID;

三个字段, 分别表示 当前标识的 ID(主键), DSC 当前标识的描述, PID 其父级ID, 比较典型的例子 是 国家, 省, 市 这种层级结构;

省份归属于国家, 因此 PID 为 国家的 ID, 以此类推;

create table DEMO (    ID varchar2(10) primary key,    DSC varchar2(100),    PID varchar2(10))--插入几条数据Insert Into DEMO values ('00001', '中国', '-1');Insert Into DEMO values ('00011', '陕西', '00001');Insert Into DEMO values ('00012', '贵州', '00001');Insert Into DEMO values ('00013', '河南', '00001');Insert Into DEMO values ('00111', '西安', '00011');Insert Into DEMO values ('00112', '咸阳', '00011');Insert Into DEMO values ('00113', '延安', '00011');

这样子就成了一个简单的树级结构, 我一般将 根节点的 PID 定为 -1;

Start With:

参考链接:

基本语法如下:

SELECT ... FROM    + 表名WHERE              + 条件3START WITH         + 条件1CONNECT BY PRIOR   + 条件2--示例Select * From DEMOStart With ID = '00001'Connect By Prior ID = PID

条件1: 表示从哪个节点开始查找, 也就是通过条件1 查询到的数据, 作为后续查询的起始节点(参数).

当然可以放宽限定条件,如 ID in (‘00001’, ‘00011’)以取得多个根节点,也就是多棵树;在连接关系中,除了可以使用列明外,还允许使用列表达式。

如果省略Start With

就默认把所有满足查询条件的Tree整个表中的数据从头到尾遍历一次,每一个数据做一次根,然后遍历树中其他节点信息.

条件2: 是连接条件,其中用PRIOR表示上一条记录,例如CONNECT BY PRIOR ID = PID,意思就是上一条记录的ID是本条记录的PID,即本记录的父亲是上一条记录。CONNECT BY子句说明每行数据将是按照层次顺序检索,并规定将表中的数据连入树形结构的关系中。

Prior 在父节点的一侧表示, 自底向上查, 在 子节点的一侧表示 自上向下查询;

条件3: 不能用在 Connect By 后, 这里的条件判断, 等价于 在最后查询出结果列表之后, 再进行条件筛选; 并非 删除掉 节点及子节点;

--自底向上Select * From DEMOStart With ID = '00113'Connect By  Prior PID = ID--结果00113   延安  0001100011   陕西  0000100001   中国  -1--自上向下Select * From DEMOStart With ID = '00001'--用 Start Wiht PID = '-1' 结果不变Connect By  Prior ID = PID--结果00001   中国  -100011   陕西  0000100111   西安  0001100112   咸阳  0001100113   延安  0001100012   贵州  0000100013   河南  00001--Where 删除Select ID, PID, DSCFrom DEMOWHERE ID <> '00011'Start With ID = '00001'Connect By Prior ID =  PID--结果00001   -1      中国00111   00011   西安00112   00011   咸阳00113   00011   延安00012   00001   贵州00013   00001   河南

下面是几条关键字特殊点:

nocycle关键字, 有时候数据本身 不合理会导致出现循环的问题, 如 将上述的 ID ‘00001’ 记录的 ‘PID’ 也改为 ‘00001’, 会出现循环的问题, 这是, 需要用到 nocycle 即可消除循环;

Connect By nocycle Prior ID = PID 即可.

connect_by_isleaf 表示当前节点是否是叶子节点

level 表示当前节点所处层级, 这里的层级指的是 从 start with 查询到的节点开始往下算起, 当前属于第几层级

Select ID, PID, DSC,connect_by_isleaf isLeaf,LEVELFrom DEMOConnect By nocycle Prior ID = PIDStart With ID = '00001';--结果ID      PID     DSC  isLeaf     LEVEL00001   00001   中国  0           000011   00001   陕西  0           100111   00011   西安  1           200112   00011   咸阳  1           200113   00011   延安  1           200012   00001   贵州  1           100013   00001   河南  1           1

这里需要注意的一个点, 如果采用的是 自底向上的 方式查询, 则 LEVEL 的 层级 同样是 从底向上, 如 00113 LEVEL 1 00011 LEVEL 2 00001 LEVEL 3.

另外一点: 如果在查询语句中 Select ID, PID, DSC, connect_by_isleaf isLeaf, LEVEL - 1 LEVEL 这种查询方式的话, 在 WHERE 判断条件中, 只需要判断 LEVEL = 1, 就可以取出 当前查询节点的 子节点(由于LEVEL 也是 伪列, 需要用子查询的方式);

SIBLINGS关键字:它会保护层次,并且在每个等级中按expre排序。

Select ID, PID, DSC,connect_by_isleaf,LEVELFrom DEMOStart With ID = '00001'Connect By nocycle Prior ID =  PIDORDER By DSC--结果, 仅贴出部分数据(层级结构被破坏了)00012   00001   贵州  1   200013   00001   河南  1   200011   00001   陕西  0   200111   00011   西安  1   300112   00011   咸阳  1   300113   00011   延安  1   300001   -1      中国  0   1--ORDER SIBLINGS  By DSCSelect ID, PID, DSC,connect_by_isleaf,LEVELFrom DEMOStart With ID = '00001'Connect By nocycle Prior ID =  PIDORDER SIBLINGS  By DSC--结果(Level 层级不变)00001   -1      中国  0   100012   00001   贵州  1   200013   00001   河南  1   200011   00001   陕西  0   200111   00011   西安  1   300112   00011   咸阳  1   300113   00011   延安  1   3

connect_by_iscycle:存在循环,将返回1,否则返回0

转载地址:http://xkusi.baihongyu.com/

你可能感兴趣的文章
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>