--测试3:再谈递归入口

--需求:根据多个地区名查询器所有下级地区

--错误:测试结果让人恼火,原来start with先于where执行,所以这个测试很失败,大家要注意

select s.areaname from s_coalarea_test s

where s.areaname='黑龙江'

or

s.areaname = '山西'

start with

s.areaname = s.areaname --既然start with只是过滤记录,那么当然我们也可以不在此处过滤,而直接用where过滤的结果了

connect by prior

s.aid=s.parentid

--测试5:递归关键字出现的位置

--需求:根据地区名称查找其所在省份

select s.areaname from s_coalarea_test s

where s.arealevel=1 --对遍历结果进行过滤

start with --start with 必须出现在where之后,但是可以是where and之间 入下例

s.areaname='大同'

connect by prior

s.parentid=s.aid

递归变形:

1.START WITH 可以省略

比如:SELECT son FROM tree

CONNECT BY PRIOR son = father;

此时不指定树的根的话,就默认把Tree整个表中的数据从头到尾遍历一次,每一个数据做一次根,然后遍历树中其他节点信息.

在这个例子中,上面的sql等价于

SELECT son FROM tree

START WITH father IN (爷爷,爸爸,儿子,孙子NB,孙子SB)

CONNECT BY PRIOR son = father;

那查询到的结果如下,有很多重复信息的

爸爸,孙子SB 儿子,孙子SB 孙子NB,孙子SB

5.还可以加where条件

我上面说了可以把start with,connect 假装看成where 条件一样.所以在这个sql语句其他地方还可以加其他where 语句,可以看成与递归查询无关.只是对整个结果起过滤作用

比如

SELECT son FROM tree WHERE son = '孙子SB'

START WITH father = '爷爷'

CONNECT BY PRIOR son = father;

当然你不能在最后部分加where,不能在connect by最后面再加.

CONNECT_BY_ISCYCLE

我们的树状属性一般都是在一条记录中记录一个当前节点的ID和这个节点的父ID来实现。但是,一旦数据中出现了循环记录,如两个节点互为对方父节点,系统就会报ORA-01436错误:

insert into t_tonedirlib(dirindex,fatherindex,dirname,status) values (666,667,'123',5);

1 row inserted

insert into t_tonedirlib(dirindex,status) values (667,666,'456',5);

1 row inserted

select dirindex,RPAD(' ',2*(LEVEL-1)) || dirname from t_tonedirlib

start with fatherindex = 666

connect by fatherindex = prior dirindex

ORA-01436: 用户数据中的 CONNECT BY 循环

10G中,可以通过加上NOCYCLE关键字避免报错。并且通过CONNECT_BY_ISCYCLE属性就知道哪些节点产生了循环:

select CONNECT_BY_ISCYCLE,dirindex,2*(LEVEL-1)) || dirname

from t_tonedirlib

start with fatherindex = 666

connect by NOCYCLE fatherindex = prior dirindex

CONNECT_BY_ISCYCLE DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname

----------------- ---------------- ---------------------------------

0 667 666 456

1 666 667 123

2 rows selected

以上就是在10G中增强的CONNECT BY了。当然对于这些增强特性的作用肯定不止如上介绍的,还需要更多高人去挖掘了。

递归查询例子:

例子:

select s.id,s.PID,s.NAME,s.CATLEVEL from T_CATALOG s

where s.catlevel=3 --对遍历结果进行过滤

start with --start with 必须出现在where之后,但是可以是where and之间 入下例

s.id=27701

connect by prior

s.id=s.pid

关联商品

SELECT * FROM (

SELECT s.id,s.CATLEVEL from T_CATALOG s

where s.catlevel=3 --对遍历结果进行过滤

start with --start with 必须出现在where之后,但是可以是where and之间 入下例

s.id=27701

connect by prior

s.id=s.pid) cat

JOIN T_PRODUCT p ON p.CATALOGID=cat.ID

如果直接join,需要用left join

SELECT p.NAME,s.id,s.CATLEVEL from T_CATALOG s

left JOIN T_PRODUCT p ON p.CATALOGID=s.ID

where s.catlevel=3 AND p.NAME IS NOT null --对遍历结果进行过滤

start with --start with 必须出现在where之后,但是可以是where and之间 入下例

s.id=27701

connect by prior

s.id=s.pid

外面join查数量:

SELECT cat.id,cat.name,count(p.ID) count FROM (

SELECT s.id,s.CATLEVEL from T_CATALOG s

where s.catlevel=3 --对遍历结果进行过滤

start with --start with 必须出现在where之后,但是可以是where and之间 入下例

s.id=27701

connect by prior

s.id=s.pid) cat

JOIN T_PRODUCT p ON p.CATALOGID=cat.ID

GROUP by cat.id,cat.name

查询父集合:

--测试4:谈级联条件 --需求:根据地区名,查询上级地区 select s.areaname from s_coalarea_test s start with s.areaname='大同' connect by prior s.parentid=s.aid --注意,此时仅仅是级联条件顺序改变了 --总结:到底是查父节点还是子节点,有级联顺序决定 --规律:【本记录字段】=【连接字段】 --如本实例:是通过本记录的parentid匹配其他记录的aid(主键)结果是查父节点 -- 如顺序颠倒,则是:有本记录的aid(主键)匹配其他记录的parentid,结果是查子节点 select s.id,s.CATLEVEL from T_CATALOG s where s.catlevel=1 --对遍历结果进行过滤 start with --start with 必须出现在where之后,但是可以是where and之间 入下例 s.id=27703 connect by prior s.pid=s.id

总结

以上是编程之家为你收集整理的oracle递归用法全部内容,希望文章能够帮你解决oracle递归用法所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

oracle 递归用法,oracle递归用法相关推荐

  1. oracle cube排序,Oracle rollup cube 用法

    1.Oracle ROLLUP和CUBE 用法 Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句. 如果是Group by  ROLLUP(A, B, C)的话, ...

  2. partition oracle用法,Oracle partition by 使用说明

    --用法详解 0.select * from wmg_test;     ---测试数据 1.select v1,v2,sum(v2) over(order by v2) as sum     --按 ...

  3. oracle中的merge into用法解析

    oracle中的merge into用法解析 merge into的形式 MERGE INTO [target-table] A USING [source-table sql] B ON([cond ...

  4. oracle中over()分析函数的用法

    摘自: http://www.poluoluo.com/jzxy/201004/81921.html 百度文库也记载了oracle中over()分析函数的用法 在泡坛子的时候中无意中发现了这个函数,才 ...

  5. oracle中的to_number,Oracle中to_number()函数的用法

    to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...

  6. Oracle中to_char()函数的用法

    Oracle中to_char()函数的用法 日期转换: to_char(date,'格式') select to_date('2005-01-01 ','yyyy-MM-dd') from dual; ...

  7. Oracle 层次查询、递归

    Oracle 层次查询.递归 语法: select ... from tablename start with 条件1  connect by 条件2  where 条件3; 1. 树结构的描述  树 ...

  8. oracle的substr函数的用法

    oracle的substr函数的用法  取得字符串中指定起始位置和长度的字符串   substr( string, start_position, [ length ] )  如:      subs ...

  9. oracle to_char函数格式,oracle 中to_char函数的用法

    一.日期格式转换 to_char(date,'格式'); select to_date('2005-01-01 ','yyyy-MM-dd') from dual; select to_char(sy ...

  10. Oracle中add_months()函数的用法

    Oracle中add_months()函数的用法 查询当前时间n个月以前的时间: select add_months(sysdate,-n) from dual; 查询当前时间n个月之后的时间: se ...

最新文章

  1. ASP.NET MVC3细嚼慢咽---(2)模板页
  2. Windows7 设置 Java环境变量
  3. MySQL DDL操作--------外键最佳实战
  4. python 去除字符串的标点符号 用_Python输入和输出
  5. Visual Studio中相对路径中的宏定义,你不了解的宏定义都在这里!
  6. linux 可执行文件去除绝对路径
  7. 【Elasticsearch】es 别名可写 索引可写 傻傻分不清
  8. 1到10选一个数字读心术_虾米启示录:理想音乐生活与现实之间 隔着一个草莓蛋糕的距离...
  9. 百度离线地图瓦片图制作
  10. 如何访问一个互联网上的xap文件
  11. 一年成为博客专家? 致!奋斗的自己
  12. python小数点后任意位_Python计算开方、立方、圆周率,精确到小数点后任意位的方法...
  13. Buried Town 《死亡日记》 安卓 1.4.3版 破解 + 部分内购 版
  14. 为何现在的程序员没工作动力,迷茫、中年危机普遍发生?
  15. ChatGPT聊天机器人如何发图片????
  16. SAP:采购申请ME51N/ME52N/ME54N/ME57屏幕增强
  17. 机器人被挠脚心_《fm及机器人系列(tk)》专题
  18. 行人重识别(1)——行人检测综述
  19. defaultuser100000或者100001是什么文件夹?
  20. rviz的使用与显示

热门文章

  1. python-比较两份word文档
  2. swift混编调用oc编写的Xib UIView出现[Storyboard] Unknown class in Interface Builder file.问题的解决
  3. pdf如何转化成word文档?
  4. 【ELIXIR】简单说下elixir的历史
  5. uniapp 运行到手机或模拟器
  6. POI的word表格居中
  7. 一次Nginx 502问题解决
  8. M1系列Mac用U盘如何重装系统
  9. socket可读,可写的条件
  10. SXF2019集合遍历