递归查询
  • 在信息系统中需要数据字典表等树状结构的数据,使用递归查询能够快速地获取树状结构数据的关联关系。
  • 树状结构的数据存放在数据表中,数据之间的层次关系(父节点与子节点)通过表的列与列之间的关系来描述。
    以类别数据树为例,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笔记 之 递归查询相关推荐

  1. 类oracle数据库pss,Oracle笔记

    Oracle笔记 Oralce简介和安装 ·常见数据库: Access .SQL Server .My SQL .DB2 .Oracle .Sybase .Infomix 数据库网络中全局数据库名不能 ...

  2. oracle md,Oracle笔记.md

    # Oracle笔记 :grinning: ## 1.32位UUID ```sql select sys_guid() from dual; ``` 上面生成的默认是大写字母组合数组,根据需要可以转换 ...

  3. oracle中的递归查询

    一.oracle中的递归查询上下级部门关系 采用的语法为 start with ... connect by ..... = prior .... 我们部门表中存在这样几条记录 id parent_i ...

  4. 李兴华oracle ppt,魔乐科技Oracle笔记超经典李兴华doc.ppt

    魔乐科技Oracle笔记超经典李兴华doc 连接符 || 图表 1 多表查询的基本语法 查一张以上的表,就叫做多表查询 例子:查询出雇员名称,部门名称和部门所在地的(一般多表查询要用别名) 统计记录数 ...

  5. 传智oracle,传智播客Oracle笔记

    Oracle笔记 oracle 传智播客_ORACLE经典视频教程 笔记(2008-09-09 15:32:34) 标签:it 分类:Oracle 1.3个默认用户 sys chang_on_inst ...

  6. oracle笔记一(sql语句方面)

    oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键    alter table ...

  7. oracle笔记之计算年龄、工龄和TRUNC

    oracle笔记之计算年龄.工龄和TRUNC 方法一:利用months_between 函数计算 SELECT TRUNC(months_between(sysdate, birthday)/12) ...

  8. sql oracle 递归查询语句,oracle递归函数 oracle中SQL递归查询

    关于oracle递归调用的自定义函数如何结束 比如存储过程a中有b,b中含a.用return结束判断,执行还是锁表,怎么解决 关于oracle递归调用的自定义函数如何结束 可以调用. C语言最基本的模 ...

  9. 冯柯《我的ORACLE笔记二:关于回滚段》接力来袭!

    感谢大家对此文的关注!我们的活动还在继续中~您对文章内容有任何疑问时,欢迎您点击原文链接,填写阅读反馈表.我们不仅会邀请作者来回答问题,还会从中抽取一位粉丝赠送精美礼品一份哦~ <我的ORACL ...

最新文章

  1. 五分钟理解yield在python中的简单用法,让你不再迷惑
  2. linux c pid获取进程名 进程名获取pid
  3. sql not in 用法_SQL 语法速成手册
  4. servlet 和filter 抛出404等异常
  5. java 时间衰减函数_TensorFlow实现指数衰减学习率的方法
  6. 从文件夹内批量获取所有文件名 批处理脚本
  7. 用JavaScript将数字转换为大写金额
  8. android 6.0 短信权限,Android6.0权限适配
  9. [HZAU]华中农业大学第四届程序设计大赛网络同步赛
  10. Linux操作系统(3.2.14find)
  11. 看阮一峰ES6 笔记
  12. 计算机组装故障排除方法,计算机的硬件组装及故障排除
  13. Python实现Pearson相关系数计算及公式化简过程
  14. easyexcle 设置列宽_在excel中,如何让excel的列宽自动调整
  15. 打开word文档提示文件未找到_Word格式转换大全!三分钟把100份Word文档转为PDF、PPT、JPG文件...
  16. Spring Cloud Netflix之Euraka Server注册中心
  17. 【微信小程序】合法域名校验出错,不在以下合法域名列表中 解决方法
  18. 大数据具备的5大发展爆点,你准备抓住哪个呢?
  19. Windows 2016 server NVIDIA cuda toolkit11.3 pytorch-gpu 踩坑教程
  20. 报错解决:AttributeError: ‘Word2VecKeyedVectors‘ object has no attribute ‘save_Word2Vec_format‘

热门文章

  1. 初学编程100个代码
  2. 华为、中兴、阿里...硬件工程师分享24家公司的面试经历
  3. mac java连通r_Mac下安装rJava,xlsx,ReporteRs包
  4. SpringBoot集成Kafka简单应用
  5. IM服务器检测客户端心跳
  6. [创新工场]2014创新工场校园招聘回文字符串维修
  7. 深圳证券交易所网络投票业务指南
  8. 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)
  9. GitHub release文件下载失败问题
  10. 使用Cion开发Arm linux ,GDB远程调试