Oracle笔记 之 递归查询
递归查询
- 在信息系统中需要数据字典表等树状结构的数据,使用递归查询能够快速地获取树状结构数据的关联关系。
- 树状结构的数据存放在数据表中,数据之间的层次关系(父节点与子节点)通过表的列与列之间的关系来描述。
以类别数据树为例,category表中的categoryid和categoryname表示该类别的编号和名称,headcatid表示上一级类别的编号,即子节点的headcatid值等于父节点的categoryid值。
表的每一行中都有一个表示父节点的headcatid(根节点的headcatid=0),通过每个节点的父节点,就可以确定整个树结构。
递归查询语法
递归查询可以从任何节点开始自顶向下查(从根往枝、叶查询)或者从底而上查(从枝、叶开始往根查询)。
- 自顶向下查
Select categoryid, categoryname, headcatidFrom categoryWhere headcatid != 0Start With categoryid = 19
Connect By Prior categoryid = headcatid;#结果
CATEGORYID CATEGORYNAME HEADCATID
1910 文化用品 19
191010 文具用品 1910
19101010 办公盒 191010
19101011 文件夹 191010
19101012 订书机 191010
19101013 文件柜 191010
19101014 帐册系列 191010
19101015 墨水 191010
19101016 印泥 191010
19101017 现代办公用品 191010
- 从底而上查
Select categoryid, categoryname, headcatidFrom categoryWhere headcatid != 0Start With categoryid = 19101013
Connect By Prior headcatid = categoryid;#结果
CATEGORYID CATEGORYNAME HEADCATID
19101013 文件柜 191010
191010 文具用品 1910
1910 文化用品 19
- 查询方向由prior关键字指明
prior关键字放在指向父节点的列(headcatid)前表示从底而上查询,prior关键字放在关键字(categoryid)前表示自顶向下查询。
递归查询关键字
select
指定显示的列或者别名。
可以包含以下关键字
- prior
执行自顶向下的查询时可以用来获取父节点的某列属性用来展示
例如:查询主分类19所有子节点(不包含自己),并展示每个子节点的父节点名称(使用prior categoryname)。
Select categoryid, categoryname, headcatid, Prior categorynameFrom categoryWhere headcatid != 0Start With categoryid = 19
Connect By Prior categoryid = headcatid;
#查询结果
CATEGORYID CATEGORYNAME HEADCATID PRIORCATEGORYNAME
1910 文化用品 19 非图书商品
191010 文具用品 1910 文化用品
19101010 办公盒 191010 文具用品
19101011 文件夹 191010 文具用品
19101012 订书机 191010 文具用品
19101013 文件柜 191010 文具用品
19101014 帐册系列 191010 文具用品
19101015 墨水 191010 文具用品
19101016 印泥 191010 文具用品
19101017 现代办公用品 191010 文具用品
19101018 其它 191010 文具用品
19101019 文具盒 191010 文具用品
- sys_connect_by_path()
执行自顶向下的查询时可以用来展示某个指定列的分级名称。
执行从底而上的查询时亦可以用来展示某个指定列的分级名称,但是顺序是由小及大,不建议使用。
例如:
Select categoryid,categoryname,headcatid,sys_connect_by_path(categoryname, '/')From categoryWhere headcatid != 0Start With categoryid = 19
Connect By Prior categoryid = headcatid;
#查询结果
CATEGORYID CATEGORYNAME HEADCATID SYS_CONNECT_BY_PATH(CATEGORYNAME,'/')
1910 文化用品 19 /非图书商品/文化用品
191010 文具用品 1910 /非图书商品/文化用品/文具用品
19101010 办公盒 191010 /非图书商品/文化用品/文具用品/办公盒
19101011 文件夹 191010 /非图书商品/文化用品/文具用品/文件夹
19101012 订书机 191010 /非图书商品/文化用品/文具用品/订书机
19101013 文件柜 191010 /非图书商品/文化用品/文具用品/文件柜
19101014 帐册系列 191010 /非图书商品/文化用品/文具用品/帐册系列
19101015 墨水 191010 /非图书商品/文化用品/文具用品/墨水
19101016 印泥 191010 /非图书商品/文化用品/文具用品/印泥
19101017 现代办公用品 191010 /非图书商品/文化用品/文具用品/现代办公用品
19101018 其它 191010 /非图书商品/文化用品/文具用品/其它
19101019 文具盒 191010 /非图书商品/文化用品/文具用品/文具盒
- connect_by_isleaf
执行自顶向下查询时用来指示某行是不是叶子节点(0=非叶子节点,1=叶子节点)。
执行从底而上查询时用来指示某行是不是根节点(0=非节点,1=根节点)。
#自顶向下查询
Select categoryid, categoryname, headcatid, connect_by_isleafFrom categoryWhere headcatid != 0Start With categoryid = 19
Connect By Prior categoryid = headcatid;
#结果
CATEGORYID CATEGORYNAME HEADCATID CONNECT_BY_ISLEAF
1910 文化用品 19 0
191010 文具用品 1910 0
19101010 办公盒 191010 1
19101011 文件夹 191010 1
19101012 订书机 191010 1
19101013 文件柜 191010 1
19101014 帐册系列 191010 1
19101015 墨水 191010 1
19101016 印泥 191010 1
19101017 现代办公用品 191010 1
19101018 其它 191010 1
19101019 文具盒 191010 1#从底而上查询
Select categoryid, categoryname, headcatid, connect_by_isleafFrom categoryStart With categoryid = 19101013
Connect By Prior headcatid = categoryid;
#查询结果
CATEGORYID CATEGORYNAME HEADCATID CONNECT_BY_ISLEAF
19101013 文件柜 191010 0
191010 文具用品 1910 0
1910 文化用品 19 0
19 非图书商品 0 1
- connect_by_root
纪录当前起始查询节点的内容。
自顶向下查询记录根节点的指定列,从底而上查询记录叶子节点的指定列。
例如:
#自顶向下查询
Select categoryid, categoryname, headcatid, connect_by_root(categoryid)From categoryWhere headcatid != 0Start With categoryid = 19
Connect By Prior categoryid = headcatid;
#结果
CATEGORYID CATEGORYNAME HEADCATID CONNECT_BY_ROOT(CATEGORYID)
1910 文化用品 19 19
191010 文具用品 1910 19
19101010 办公盒 191010 19
19101011 文件夹 191010 19
19101012 订书机 191010 19
19101013 文件柜 191010 19
19101014 帐册系列 191010 19
19101015 墨水 191010 19
19101016 印泥 191010 19
19101017 现代办公用品 191010 19
19101018 其它 191010 19
19101019 文具盒 191010 19#从底而上查询
Select categoryid, categoryname, headcatid, connect_by_root(categoryid)From categoryStart With categoryid = 19101013
Connect By Prior headcatid = categoryid;
#结果
CATEGORYID CATEGORYNAME HEADCATID CONNECT_BY_ROOT(CATEGORYID)
19101013 文件柜 191010 19101013
191010 文具用品 1910 19101013
1910 文化用品 19 19101013
19 非图书商品 0 19101013
- connect_by_iscycle
判断递归查询是否有循环体,如果有循环体该字段为1,与nocycle(nocycle紧随connect by其后)配合使用。
例如:
Select categoryid, categoryname, headcatid, connect_by_iscycleFrom categoryWhere headcatid != 0Start With categoryid = 19
Connect By nocycle Prior categoryid = headcatid;
#结果
CATEGORYID CATEGORYNAME HEADCATID CONNECT_BY_ISCYCLE
1910 文化用品 19 0
191010 文具用品 1910 0
19101010 办公盒 191010 0
19101011 文件夹 191010 0
19101012 订书机 191010 0
19101013 文件柜 191010 0
19101014 帐册系列 191010 0
19101015 墨水 191010 0
19101016 印泥 191010 0
19101017 现代办公用品 191010 0
19101018 其它 191010 0
19101019 文具盒 191010 0
from
指定树状结构数据集。
where
对查询结果树进行过滤。
注意:where条件虽然是对查询结果的过滤,但应写在start with 和 connect by 之前。
例如:过滤headcatid=0的根节点。
Select categoryid, categoryname, headcatid, connect_by_root(categoryid)From categoryWhere headcatid != 0Start With categoryid = 19101013
Connect By Prior headcatid = categoryid;
#结果
CATEGORYID CATEGORYNAME HEADCATID CONNECT_BY_ROOT(CATEGORYID)
19101013 文件柜 191010 19101013
191010 文具用品 1910 19101013
1910 文化用品 19 19101013
start with
指定查询起始位置。
注意:start with 子句和 connect by 子句可以交换位置。
例如:查询分类级别为4的所有分类的父节点。
Select categoryid, categoryname, headcatidFrom categoryWhere headcatid != 0Start With deptlevelid = 4
Connect By Prior headcatid = categoryid;
#查询结果
60060501 传统工艺品 600605
600605 工艺品 6006
6006 创意文化 60
60060502 现代工艺品 600605
600605 工艺品 6006
6006 创意文化 60
60060503 外国工艺品 600605
600605 工艺品 6006
connect by
指定递归查询的关联条件和递归查询的方向(自顶向下或者从底而上)。
- prior
prior关键字放在指向父节点的列(headcatid)前表示从底而上查询,prior关键字放在关键字(categoryid)前表示自顶向下查询。
包含所有关键字的示例
查询二级分类19的所有枝叶节点。
Select Level,categoryid,categoryname,headcatid,sys_connect_by_path(categoryname, '/'),connect_by_isleaf,connect_by_iscycle,connect_by_root(categoryid)From categoryWhere headcatid != 0Start With categoryid = 19
Connect By nocycle Prior categoryid = headcatid;
#查询结果
2 1910 文化用品 19 /非图书商品/文化用品 0 0 19
3 191010 文具用品 1910 /非图书商品/文化用品/文具用品 0 0 19
4 19101010 办公盒 191010 /非图书商品/文化用品/文具用品/办公盒 1 0 19
4 19101011 文件夹 191010 /非图书商品/文化用品/文具用品/文件夹 1 0 19
4 19101012 订书机 191010 /非图书商品/文化用品/文具用品/订书机 1 0 19
4 19101013 文件柜 191010 /非图书商品/文化用品/文具用品/文件柜 1 0 19
4 19101014 帐册系列 191010 /非图书商品/文化用品/文具用品/帐册系列 1 0 19
4 19101015 墨水 191010 /非图书商品/文化用品/文具用品/墨水 1 0 19
4 19101016 印泥 191010 /非图书商品/文化用品/文具用品/印泥 1 0 19
4 19101017 现代办公用品 191010 /非图书商品/文化用品/文具用品/现代办公用品 1 0 19
4 19101018 其它 191010 /非图书商品/文化用品/文具用品/其它 1 0 19
4 19101019 文具盒 191010 /非图书商品/文化用品/文具用品/文具盒 1 0 19
Oracle笔记 之 递归查询相关推荐
- 类oracle数据库pss,Oracle笔记
Oracle笔记 Oralce简介和安装 ·常见数据库: Access .SQL Server .My SQL .DB2 .Oracle .Sybase .Infomix 数据库网络中全局数据库名不能 ...
- oracle md,Oracle笔记.md
# Oracle笔记 :grinning: ## 1.32位UUID ```sql select sys_guid() from dual; ``` 上面生成的默认是大写字母组合数组,根据需要可以转换 ...
- oracle中的递归查询
一.oracle中的递归查询上下级部门关系 采用的语法为 start with ... connect by ..... = prior .... 我们部门表中存在这样几条记录 id parent_i ...
- 李兴华oracle ppt,魔乐科技Oracle笔记超经典李兴华doc.ppt
魔乐科技Oracle笔记超经典李兴华doc 连接符 || 图表 1 多表查询的基本语法 查一张以上的表,就叫做多表查询 例子:查询出雇员名称,部门名称和部门所在地的(一般多表查询要用别名) 统计记录数 ...
- 传智oracle,传智播客Oracle笔记
Oracle笔记 oracle 传智播客_ORACLE经典视频教程 笔记(2008-09-09 15:32:34) 标签:it 分类:Oracle 1.3个默认用户 sys chang_on_inst ...
- oracle笔记一(sql语句方面)
oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键 alter table ...
- oracle笔记之计算年龄、工龄和TRUNC
oracle笔记之计算年龄.工龄和TRUNC 方法一:利用months_between 函数计算 SELECT TRUNC(months_between(sysdate, birthday)/12) ...
- sql oracle 递归查询语句,oracle递归函数 oracle中SQL递归查询
关于oracle递归调用的自定义函数如何结束 比如存储过程a中有b,b中含a.用return结束判断,执行还是锁表,怎么解决 关于oracle递归调用的自定义函数如何结束 可以调用. C语言最基本的模 ...
- 冯柯《我的ORACLE笔记二:关于回滚段》接力来袭!
感谢大家对此文的关注!我们的活动还在继续中~您对文章内容有任何疑问时,欢迎您点击原文链接,填写阅读反馈表.我们不仅会邀请作者来回答问题,还会从中抽取一位粉丝赠送精美礼品一份哦~ <我的ORACL ...
最新文章
- 五分钟理解yield在python中的简单用法,让你不再迷惑
- linux c pid获取进程名 进程名获取pid
- sql not in 用法_SQL 语法速成手册
- servlet 和filter 抛出404等异常
- java 时间衰减函数_TensorFlow实现指数衰减学习率的方法
- 从文件夹内批量获取所有文件名 批处理脚本
- 用JavaScript将数字转换为大写金额
- android 6.0 短信权限,Android6.0权限适配
- [HZAU]华中农业大学第四届程序设计大赛网络同步赛
- Linux操作系统(3.2.14find)
- 看阮一峰ES6 笔记
- 计算机组装故障排除方法,计算机的硬件组装及故障排除
- Python实现Pearson相关系数计算及公式化简过程
- easyexcle 设置列宽_在excel中,如何让excel的列宽自动调整
- 打开word文档提示文件未找到_Word格式转换大全!三分钟把100份Word文档转为PDF、PPT、JPG文件...
- Spring Cloud Netflix之Euraka Server注册中心
- 【微信小程序】合法域名校验出错,不在以下合法域名列表中 解决方法
- 大数据具备的5大发展爆点,你准备抓住哪个呢?
- Windows 2016 server NVIDIA cuda toolkit11.3 pytorch-gpu 踩坑教程
- 报错解决:AttributeError: ‘Word2VecKeyedVectors‘ object has no attribute ‘save_Word2Vec_format‘
热门文章
- 初学编程100个代码
- 华为、中兴、阿里...硬件工程师分享24家公司的面试经历
- mac java连通r_Mac下安装rJava,xlsx,ReporteRs包
- SpringBoot集成Kafka简单应用
- IM服务器检测客户端心跳
- [创新工场]2014创新工场校园招聘回文字符串维修
- 深圳证券交易所网络投票业务指南
- 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)
- GitHub release文件下载失败问题
- 使用Cion开发Arm linux ,GDB远程调试