hierarchical queries

 

 

通过两个例子来使自己想通这个父子树遍历过程

 

 

 

 

首先prior 后面是empno 那么就把start with 检索出来的值赋值给他 第二条记录就用mgr = 7566 检索 相当于把自己的员工号拿来

当检索值 查查我的小弟都谁 

 

第一个例子:找出JONES的小弟有几个人(包括自己,直接和间接的小弟) top down

首先start with 是遍历的起始位置 他就相当于执行了一条where 语句 如上的第一个例子的start with就相当于

 

select * from emp where empno = 7566 这样他便检索出来的第一条root记录

 

因为prior 在empno前面,那么说明empno就是parent_key ,而 mgr是 child_key 为什么要这么理解呢

首先官方文档已经明确说明放在prior后是指的父记录的字段,而此时刚执行完start with后,当要执行connect by 语句的时候会拿着父记录的字段的值(执行完start with后的结果:此时为7566)作为检索条件来遍历,实际上也就是运行 where mgr = 7566 这种限制条件来检索出来的记录也就是第二条记录,再次把第二条记录的empno=7788取出来的作为where mgr = 7788 的条件来搜索相对应的记录,继续这样遍历直到遍历到没有后,返回到上一层次的记录继续找是否有其他记录。这种是top down 的遍历模式,因为从一开始connect by 

的时候你就拿着自己的员工号去作为经理号的字面值来检索自己手下有几个小弟的。

所谓父记录与子记录 也是一种相对说法,不同层的两个级别的都可以相互成为父子关系,比如 1 2 可以互称父子 23 互称父子,父记录应该是先检索出来的记录。

 

 

 

prior 后面是mgr,start with根据自己员工号7566 检索出来的自己经理员工号为7839,把这个7839用来给connect by玩儿

where empno = 7839检索出老大的信息 

 

这第二个例子:找到JONES的老大都有谁,bottom up

 

如果看明白第一个例子这个比较好理解了,还是 start with 来检索出empno = 7566的父记录,父记录里面mgr = 7839 这个编号实际

是自己老大的编号,那么继续找自己老大的编号吧connect by prior 相当于运行  select * from emp where empno = 7839检索的第一条记录,这条记录相对于下一条要检索的记录叫父记录。等要检索写一条记录时正好就是把父记录的mgr值赋值给prior后面的字段

 

 

这种由于 pid = 3不存在所以只有第一条start with 产生的记录了

 

 

sys_connect_by_path(child,'/')格式化输出 在前面加parent的名称

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值