oracle 递归的使用

oracle数据库提供给了一个强大的功能:递归

这功能目前在db2中是没有的。

1. 语法:

SELECT *

  FROM TABLE_NAME T

 START WITH T.CHILD_ID = '***'

CONNECT BY PRIOR T.CHILD_ID = T.PARENT_ID  (注意:不能写成 CONNECT BY PRIOR T.PARENT_ID = T.CHILD_ID  )

2.特别讲解: 

START WITH T.CHILD_ID = '***'

这句话的意思是以 aaa 开始的行,如果在这个表中 CHILD_ID = 'aaa' 的数据有7行,并且PARENT_ID='aaa'的只有一条数据的时候,那么搜出来的结果集中,就 PARENT_ID='aaa' 的数据就有7条数据;

如果PARENT_ID='aaa'的数据有两条数据的话,那么搜出来的结果集中,就 PARENT_ID='aaa' 的数据就有14条数据;

如果PARENT_ID='aaa'的数据有两条数据的话,还希望搜出两条数据,那么就需要加上 DISTINCT 关键字(只会对 CHILD_ID ,PARENT_ID  两列起作用 )。

在大多数的情况下,CHILD_ID是不会有重复的,所以只要 CHILD_ID 不重复就可以不用加 DISTINCT 关键字,就可以得到我们想要的结果。

那么什么时候我们会用到刚才我讲到的情况呢,设置批次依赖的时候。批次依赖总是会遇到这种情况: A批次要同时依赖于B批次,C批次,D批次。

这时候就得这么设计表了

CHILD_ID    PARENT_ID

A                      B

A                      C

A                      D


3.原则

start with 后面是头,头可以有多个,也可以有1个,这个看具体的需求了。

如何控制是多个还是一个呢,在 start with 后 加上 and  条件就可以了。

当然,后面的链条也可以按照需求加上你需要的  and 条件。

add by xingshi89 20130720

4. 死循环

这个是我昨天下午刚遇到的一个问题。

本来写的好好的sql 递归查询语句,以前用的好好的,并且也在生产上执行成功了,今天拿出来用居然不行了。

让我小郁闷了一把!!!

原因是在你的数据问题,而不是sql写的有问题,比如下面这种情况:

有一条数据: PARENT_ID  = 1  ,CHILD_ID = 2678  ;

另一条数据: PARENT_ID  = 2678 , CHILD_ID = 1 ;

这样的数据递归sql语句是不能执行的!oracle具体报错的错误代码我忘记了,这个也不重要了,重要的是大家要记得这种情况,到时候别怀疑自己的sql语句啊,呵呵

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle递归可以通过使用`WITH`子句和`CONNECT BY`子句来实现。这种递归查询方式被称为“递归公共表达式(Recursive Common Table Expression)”。 下面是一个简单的递归查询的例子,假设我们有一个员工表`EMP`,其有一个字段`MGR`表示员工的上级经理: ``` EMPNO ENAME JOB MGR 1 John Manager NULL 2 Bob Clerk 1 3 Alice Clerk 1 4 Tom Analyst 2 5 Mary Analyst 3 6 Jack Salesman 1 ``` 我们可以使用递归查询来查找每个员工的所有下属,包括直接下属和间接下属。下面是一个使用递归查询的示例: ``` WITH emp_tree AS ( SELECT empno, ename, job, mgr, 0 AS level FROM emp WHERE mgr IS NULL UNION ALL SELECT emp.empno, emp.ename, emp.job, emp.mgr, emp_tree.level + 1 FROM emp_tree JOIN emp ON emp.mgr = emp_tree.empno ) SELECT empno, ename, job, level FROM emp_tree ORDER BY level, empno; ``` 在上面的查询,我们首先定义了一个递归公共表达式`emp_tree`,它包含了所有顶级经理的信息。然后我们使用`UNION ALL`运算符将顶级经理和他们的直接下属组合在一起,并将`level`设置为0。接下来,我们使用`JOIN`运算符将每个下属与其直接上级经理连接起来,并将`level`设置为上级经理的`level + 1`。最后,我们从递归公共表达式`emp_tree`选择所有下属的信息,并按照`level`和`empno`排序。 执行以上查询的结果如下: ``` EMPNO ENAME JOB LEVEL ---- ------ --------- ----- 1 John Manager 0 2 Bob Clerk 1 3 Alice Clerk 1 6 Jack Salesman 1 4 Tom Analyst 2 5 Mary Analyst 2 ``` 在这个结果,我们可以看到每个员工的编号、姓名、职位和级别。其,顶级经理的级别为0,直接下属的级别为1,间接下属的级别为2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值