通过两个例子来使自己想通这个父子树遍历过程
首先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的名称