oracle: OCA-047-题解与实验(5) --start with 与 connect by的用法

最近忙啊,酷币的银啊!

题目:

答案解释:关于start with 与 connect by的内容,这两个词语核心功能是:生成树形结果,而题意就是生成树形结果。

这里呢,咱不用题目中的例子,用oracle提供的示例数据库例子,对应employees这个表,估计上面的exhibit也是选取示例中的4列而生成的。看查询示例:

示例一:

SQL> select t.employee_id,t.manager_id, t.last_name from employees t
  2  start with t.manager_id = 100
  3  connect by  prior t.employee_id = t.manager_id;
 
EMPLOYEE_ID MANAGER_ID LAST_NAME
----------- ---------- -------------------------
        101        100 Kochhar                  这条结果是第一个manager_id=100的记录,子节点101的父节点是100  
        108        101 Greenberg                子节点108的父节点是101,可见是将上一条的101作为父节点向下找子节点的
         109        108 Faviet                   同理108的子节点是谁呢?是109
        110        108 Chen                     109有子节点么?显然没有,所以继续找108的其他子节点,找到了110
        111        108 Sciarra                  110有子节点么?显然没有,所以继续找108的其他子节点,找到了111
        112        108 Urman                    111有子节点么?显然没有,所以继续找108的其他子节点,找到了112      
        113        108 Popp                     112有子节点么?显然没有,所以继续找108的其他子节点,找到了113
        200        101 Whalen                   同上继续找108其他子节点,发现没有,返回108的父节点101,找到101其他子节点200 
        203        101 Mavris                   200有子节点么?显然没有,所以继续找101的其他子节点,找到了203 
        204        101 Baer                     以下就是重复了....
        205        101 Higgins                  ...
        206        205 Gietz                    ... 
        102        100 De Haan                  ... 
        103        102 Hunold

到这里,能否总结出规律吧:

1、遍历是自上而下的(假设父节点在上层),从父节点开始向子节点开始遍历,只要有子节点就以该子节点为父节点继续遍历,直到没有子节点了返回上一层找其他子节点。

2、哪个数值作为第一个父节点呢,start with指定的就是,随机选取一个满足的记录就开始遍历了。记住,该语句的核心就是返回一个树形结构。树形结构总体是由两个列值组成的如,manager_id和employee_id,物理上分两列,但实际上由于对应关系都是这个树上的节点元素。虽然有完整的树,但可以截取需求的树,而树根就是start with指定的。如start with指定了总老板的id即完整树的根,那么返回的就是整个树遍历结果。选取某个节点,返回的就是部分树的遍历结果。

3、 prior是什么作用? 下面看:

 示例二:

SQL> select t.employee_id,t.manager_id, t.last_name from employees t
  2  start with t.manager_id = 100
  3  connect by t.employee_id = prior t.manager_id;
 
EMPLOYEE_ID MANAGER_ID LAST_NAME
----------- ---------- -------------------------
        101        100 Kochhar                  101的父节点是100,没话说
         100            King                     100的父节点是NULL?? 发现了问题,找完了101的父节点又开始找100的父节点了。
         102        100 De Haan                  由于上条记录100已经没有父节点了,又重新回到下层,找到满足语句的102(102的父节点是100) 
         100            King                     但是102的父节点100仍然没有父节点
         114        100 Raphaely                 只好找到114
        100            King
        120        100 Weiss
        100            King
        121        100 Fripp
        100            King
        122        100 Kaufling
        100            King
        123        100 Vollman
        100            King                     一直这么悲剧的下去

什么规律呢?prior其实就是向上遍历了,找到节点后,将该节点的父节点作为子节点,找它的父节点,这就是自下向上遍历了。其他语句因素和上面描述的都一样。

根据上面描述,你能阅读下面内容么?

SQL> select t.employee_id,t.manager_id, t.last_name from employees t
  2  start with t.manager_id = 108
  3  connect by t.employee_id = prior t.manager_id;
 
EMPLOYEE_ID MANAGER_ID LAST_NAME
----------- ---------- -------------------------
        109        108 Faviet
        108        101 Greenberg
        101        100 Kochhar
        100            King
        110        108 Chen
        108        101 Greenberg
        101        100 Kochhar
        100            King

 最后说说 where所起的作用,看下个示例

示例三:

SQL> select t.employee_id,t.manager_id, t.last_name from employees t
  2  where t.last_name like '%an'
  3  start with t.manager_id = 100
  4  connect by prior t.employee_id =  t.manager_id;
 
EMPLOYEE_ID MANAGER_ID LAST_NAME
----------- ---------- -------------------------
        112        108 Urman                    
        102        100 De Haan

对比示例一,可以知道where是对遍历完的树形结构进行筛选,找到满足where条件的所有节点。如题是满足名字以‘an’结尾的雇员。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值