分级查询主要用于查询树形结构的记录。树形结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述。
树形结构示例:
查询雇员表中员工编号、姓名及员工负责人,结果如图1所示。从结果中可以发现,Hardy和Rory的负责人是John,John的负责人是Donald;Eric和Kary的负责人是Harky,Harky的负责人是Donald,最终可以形成一张树形结构图,如图2所示。
图1
图2
分级查询语法格式:
SELECT [LEVEL],COLUMN,... FROM TABLE [WHERE CONDITION(S)] [START WITH CONDITION(S)] [CONNECT BY PRIOR COLUMN1 = COLUMN2] ;
1.LEVEL代表层级。 在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为 1 ,根节点的子节点为 2 , 依此类推。
2.START WITH定义查找起始节点。在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。 不但可以指定一个根节点,还可以指定多个根节点。START WITH 子句为可选项,若该子句被省略,则表示所有满足查询条件的行作为根节点。
3.CONNECT BY 子句指定层次检索的顺序。 根据PRIORY 运算符放置在连接关系的位置,从而确定查找树结构是的顺序是自顶向下还是自底向上。CONNECT BY PRIOR PARENT KEY= CHILD KEY,表明顺序是自顶向下;CONNECT BY PRIOR CHILD KEY= PARENT KEY,表明顺序是自底向上。
图3
图4
对于分级查询的结果集节点的裁剪有两种方式,一种方式是在WHERE子句中指定过滤条件,另一种方式是在CONNECT BY子句中指定过滤条件。两种方式的区别是,WHERE子句中指定过滤条件,只能裁剪掉满足条件的节点,而CONNECT BY子句中指定过滤条件,不仅能够裁剪掉满足条件的节点,而且能裁剪掉满足条件节点所在的分支后的所有后代节点或前辈节点。