ORACLE-递归

语法: start with…connect by…prior
 start with子句:递归的条件。需要注意的是如果with后面的值是子节点那么求出的就是他的父节点和祖宗节点;如果是父节点那么求出的就是他的子节点和子孙节点。
 connect by子句:连接条件。 关键词prior,prior跟它右边的父节点放在一起(prior p.parent)表示往父节点方向遍历,;反之,如果prior跟子节点放在一起(prior p.id)表示往叶子方向遍历。这里需要注意的 =p.id 放在prior关键词的前面或者后面都没什么关系,也就是上面可以这样写 p.id= prior p.paren。重要的是prior旁边放的是什么。
 level伪列:递归的层次表示,用来进行输出缩进。可以看到递归层次,看起来很直观。 需要注意的是Level 也可以放在Group by后面,也可以放在select 后面。

示例:

SELECT *, level FROM table 
START WITH name = 'xxx' 
CONNECT BY PRIOR parent_id = id

注:where条件的作用域不是在递归查询中的,而是在递归查询完后的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle可以使用递归查询来解决一些复杂的问题。要判断递归,可以使用以下方法: 1. 使用WITH RECURSIVE语句来定义递归查询,并在查询的末尾使用SELECT语句将结果返回。如果查询中使用了WITH RECURSIVE语句,则该查询是递归查询。 例如: WITH RECURSIVE cte (id, parent_id) AS ( SELECT id, parent_id FROM my_table WHERE parent_id IS NULL UNION ALL SELECT t.id, t.parent_id FROM my_table t JOIN cte ON t.parent_id = cte.id ) SELECT * FROM cte; 2. 检查递归查询的定义是否包含递归条件。递归条件是指在递归查询中使用的WHERE子句,该子句包含对递归关系的引用。如果查询中包含递归条件,则该查询是递归查询。 例如: WITH RECURSIVE cte (id, parent_id) AS ( SELECT id, parent_id FROM my_table WHERE parent_id IS NULL UNION ALL SELECT t.id, t.parent_id FROM my_table t JOIN cte ON t.parent_id = cte.id WHERE t.parent_id IS NOT NULL --递归条件 ) SELECT * FROM cte; 3. 检查递归查询的定义是否包含递归终止条件。递归终止条件是指在递归查询中使用的WHERE子句,该子句指示递归何时应该停止。如果查询中包含递归终止条件,则该查询是递归查询。 例如: WITH RECURSIVE cte (id, parent_id) AS ( SELECT id, parent_id FROM my_table WHERE parent_id IS NULL UNION ALL SELECT t.id, t.parent_id FROM my_table t JOIN cte ON t.parent_id = cte.id WHERE t.parent_id IS NOT NULL AND level <= 5 --递归终止条件 ) SELECT * FROM cte; 在这个例子中,递归查询将一直执行,直到递归层级达到5或没有更多的匹配项。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值