start with connect by 子句

来源:互联网 发布:2017剑灵捏脸数据天女 编辑:程序博客网 时间:2024/06/05 11:11

l  对于含有层次话查询的语句需要用到start with  connect by 子句;

语法结构:

SELECT  [level] ,column,expression ,……

FROM  table

[WHERE where_clause]

[[START WITHstart_condition]  [ CONNECT BY PRIOR prior_condition]]

[ORDER BY column,expression,….]

要点总结
1、子句的语法书写顺序。
select -> from -> where -> start with -> connect by -> order by
where写在connect by后面就不行,报错。

2、子句的执行顺序
from -> start with -> connect by -> where -> select -> order by

3、LEVEL 是一个伪列,代表位于树的第几层。对根节点来说,LEVEL返回1,根节点的子节点返回2,依次类推。

4、start_condition 定义了层次化查询的起点。当编写层次化查询时必须指定start with子句(该子句可以使用子查询)。

5、prior_condition 定义了父行和子行之间的关系。当编写层次化查询时必须定义connect by prior子句。

6、遍历一颗树时可以从根节点遍历,也可以只遍历某一个分支。可以从上至下遍历,也可以从下至上遍历,这时connect by prior条件需要调换一下位置。例如:

--表例如下:


--正向遍历(从上至下):

SELECT T.EMPLOYEE_ID, T.MANAGER_ID,T.FIRST_NAME, T.LAST_NAME ,LEVEL

            FROM hr.EMPLOYEES T

 STARTWITH T.EMPLOYEE_ID =100

CONNECTBYPRIOR T.EMPLOYEE_ID = T.MANAGER_ID

ORDERBYLEVEL, T.EMPLOYEE_ID;

结果如下:

 

--反向遍历(从下至上):

SELECT T.EMPLOYEE_ID, T.MANAGER_ID,T.FIRST_NAME, T.LAST_NAME,LEVEL

            FROM HR.EMPLOYEES T

      STARTWITH T.EMPLOYEE_ID =118

CONNECTBYPRIOR T.MANAGER_ID = T.EMPLOYEE_ID

 ORDERBYLEVEL, T.EMPLOYEE_ID;

结果如下:


7、where_clause从查询中去除某个指定的节点,由于执行顺序的问题,如果删除一个父节点,那么不影响子节点的显示。如果想去除某个分支(分支树),那么需要在 prior_condition 之后加入条件,例如 :…….connect by prior employee_id=manager_id andemployee_id!=114

那么与114有关的父节点和子节点全部去除。