ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Hierarchical Retrieval

Hierarchical Retrieval

原创 Linux操作系统 作者:keeptrying 时间:2012-11-21 14:38:00 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: multitable insert
请登录后发表评论 登录
全部评论

注册时间:2011-04-25

  • 博文量
    130
  • 访问量
    1031780