1、 层次查询(Hierarchical Querie)
使用层次查询可以基于一个表中的自然层次关系来检索数据。
关系数据库中并不能以层次方式来存储记录,但在单个表中的行之间却可以存在层次关系。单个表中的行之间的层次关系可以构成一个树(tree),因而在行之间就存在父-子关系。通过树结构中的父-子关系,可以控制层次关系的开始点和方向(自顶向下/自底向上)。
2、 层次查询语法:
SELECT [LEVEL],列名,表达式 --伪列level表示返回行在层次关系中所处的位置(从1开始)
FROM 表名 --指定从哪里检索数据
[WHERE条件] --限定数据
START WITH 条件 --指定层次关系的根行,即层次关系从哪里开始
CONNECT BY PRIOR 条件; --指定构建层次的方向
注:START WHIT和CONNECT BY子句不属于ANSI SQL标准!
3、 遍历树-指定开始点
START WITH 子句中指定的条件必须满足。START WITH子句接受任何有效的条件。
START WITH子句指定要构建的层次关系的根。
如果省略了START WITH子句,遍历树时会把表中的所有行都看作为根。
示例:...START WITH manager_id IS NULL;
4、 遍历树-指定方向
语法:CONNECT BY PRIOR column1=column2
方向:从顶向下:Column1=Parent Key,Column2=Child Key(父行在左,子行在右)
从底向上:Colunm1=Child Key,Column2=Parent Key(子行在左,父行在右)
指定方向的实质是PRIOR关键字,PRIOR一般修饰父行的列(自顶向下)
CONNECT BY PRIOR col1=col2等效于CONNECT BY col2=PRIOR col1
PRIOR在CONNECT BY 子句中只出现一次,即CONNECT BY 子句中包含复合条件
比如:CONNECT BY last_name !=’King’ AND PRIOR employee_id=manager_id
示例:
表employees中的行存在父-子层次关系:父行中employee_id列的值等于子行中manager_id列的值。通过CONNECT BY PRIOR子句,可以指定遍历树时的方向。
自顶向下:...CONNECT BY PRIOR employee_id=manager_id
自底向上:...CONNECT BY PRIOR manager_id=employee_id
在CONNECT BY子句中不能包含子查询。
5、 示例-自顶向下:
SELECT last_name||' reports to '|| PRIOR last_name "Walk Top Down"
FROM employees
START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id ;
注:在select列表中last_name列出现了两次,必须使用PRIOR来修饰一个以区分哪个是父行的。
示例-自底向上:
SELECT employee_id,last_name,job_id,manager_id FROM employees
START WITH employee_id=101
CONNECT BY PRIOR manager_id=employee_id AND salary>15000;
6、 用LEVEL伪列将行分等级(Ranking Rows)
可以使用伪列LEVEL来显示层次结构中每一行的级别。
层次结构中,根节点的级别为1,根的子节点的级别为2,根的子节点的子节点的级别为3,以此类推。
示例:用LEVEL和LPAD格式化分级报告:
SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'-') AS org_chart
FROM employees
START WITH last_name='King'
CONNECT BY PRIOR employee_id = manager_id
7、 修剪分支
使用WHERE子句中的限定条件去除一个结点:
比如:WHERE last_name !=’Higgins’将去除last_name等于’Higgins’的行。
在CONNECT BY子句中加上限定条件去除一个分支:
比如:CONNECT BY PRIOR employee_id=manager_id AND last_name !=’Higgins’将去除last_name为’Higgins’的行为开始的分支。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25744374/viewspace-749660/ ,如需转载,请注明出处,否则将追究法律责任。