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有关的父节点和子节点全部去除。