Oracle中start with xx connect by prior 语句解析
Oracle中start with xx connect by prior 语句解析
Oracle这种的start with语句主要对B型树的数据进行递归查询.可以指定数据树上的任一节点,然后查找到它所有的子节点或者父节点.
现在有如下图的数据:
我们先想数据库插入数据,这里用到oracle的批量插入写法
# 1 建表 CREATE TABLE START_WITH ( sub_levels VARCHAR2(255) NOT NULL , super_levels VARCHAR2(255) DEFAULT '' NULL ) NOCOMPRESS ; # 批量插入方法1 INSERT INTO START_WITH(sub_levels,super_levels) select '2','1' from dual union all select '3','1' from dual; # 批量插入方法2 INSERT ALL INTO START_WITH(sub_levels,super_levels) VALUES ('4','2') INTO START_WITH VALUES ('5','2') INTO START_WITH VALUES ('6','3') INTO START_WITH VALUES ('7','3') INTO START_WITH VALUES ('8','4') INTO START_WITH VALUES ('9','4') select 1 from dual; # 正常写法 insert into START_WITH(sub_levels,super_levels) values ('10','8');
使用start with 实例1 -->>查询指定节点下的所有子节点
# 实例1 : 查询指定节点下的所有子节点 select * from START_WITH start with sub_levels = '2' connect by prior sub_levels = super_levels order by super_levels,sub_levels;
上面的查询结果如下:
现在对start with的用法进行解析.
2.1
start with sub_levels = '2'
这段sql相当进行一个查询select * from START_WITH where sub_levels = '2'
;我们能得到
2.2 接着看
connect by prior sub_levels = super_levels
这段sql 其中的prior sub_levels 表示将2.1中结果的sub_levels作为现在的值,此时这句sql相当于
connect by 2 = super_levels
这句sql我们可以看做是一个新的查询
select * from START_WITH super_levels = 2
我们能得到结果
接着程序会对我么sub_levels 为4的情况执行start with语句和connect by 语句,依次递归直到最后一个子级为止.
2.3 我们可以将整个查询过程看做是如下流程
使用start with 实例2 : -->> 查询指定节点下的所有父节点
# 实例2 : 查询指定节点下的所有父节点 select * from START_WITH start with sub_levels = '8' connect by prior super_levels = sub_levels order by super_levels,sub_levels;
结果如下:
查询过程相当于:
其余两查询
select * from START_WITH start with super_levels = '2' connect by prior sub_levels = super_levels order by super_levels,sub_levels;
select * from START_WITH
start with super_levels = '8'
connect by prior super_levels = sub_levels
order by super_levels,sub_levels;
总结
通过上面的结果我们可以发现如下规律
a. 当在prior 后跟子级时是自上而下的查询所有的子节点
b. 当在prior后更父级时是自下而上的查询所有的父节点
Oracle中start with xx connect by prior 语句解析相关推荐
- oracle中start with和connect by的用法理解
Oracle中start with和connect by 用法理解 转自:http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多 ...
- 用select 语句中的START WITH...CONNECT BY PRIOR子句实现递归查询
from http://www.javaeye.com/topic/184074 今天发现在oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归 ...
- Oracle系列:start with connect by prior 使用方法
一.语法 { CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] | START WITH con ...
- oracle 递归查询,Oracle递归查询(start with…connect by prior)
查询基本结构: select - from table_name start with 条件1 connect by 条件2 1.建测试用表 1 create table test_prior( 2 ...
- 在Oracle中写出性能优良的SQL语句
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器 ...
- oracle中的start with connect by用法
这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始数据: 1 create table a_test2 ( parentid var ...
- 测试oracle中set arraysize xx对性能的影响
arraysize定义了一次返回到SQLPLUS客户端的行数,当扫描了arraysize 行后,停止扫描,返回数据,然后继续扫描. 这个过程就是统计信息中的SQL*Net roundtrips to/ ...
- oracle 分隔符行转列,Oracle 中使用 Regexp_substr 和 Connect By 来根据分隔符进行列转行操作示例...
先查询出数据库中记录 select t.ID,t.存储名称,t.存储路径,t.上传人,t.上传时间 from zlmaindata.投标记录 t 以上为查询结果,我要将[存储名称]多文件名按照分号进行 ...
- Oracle中一把梭获取对象DDL创建语句
文章目录 1.DBMS_METADATA.GET_DDL包详解以及使用案例 1.1.官方文档参考 1.2.常用获取ddl信息案例 1.2.1.查看表以及对应索引创建语句 1.2.2.获取用户下所有对象 ...
最新文章
- 1.DBCP和CP30的区别
- Sublime Text3前端必备插件
- 正则表达式去除括号的问题
- 计算机科学论文吧,计算机科学毕业论文.doc
- 小白知识摘录__环境变量
- jenkins+maven+gitlab触发构建
- Cisco 3550交换机IOS备份(真实设备演示)
- matlab 指数拟合原理,matlab指数增长和阻滞增长拟合代码.doc
- 关于 *.csproj: 找不到此项目类型所基于的应用程序 的解决方案
- android 监控行为,一种针对Android系统App行为的监控方法
- PLSQL计算日期是当月第几周
- 【GDOI2018模拟7.7】暴力大神hxx 树形dp
- 【java毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站
- 多少量级才算是高并发
- 醍醐灌顶——我眼中的Spring Cloud
- 2016年主机游戏大作全方位预测
- 七麦数据analysis参数算法还原
- 鲲鹏加持,浩瀚深度称量互联网天下再添新砝码
- 全球与中国回转窑市场深度研究分析报告
- Linux WIFI优先连接5G频段