4.5 层次化查询
-
层次化查询语法
-
select 列名1、列名2… from 表名 start with 开始条件 connect by prior 递归条件
-
start with:指定查询的起点,即从哪些记录开始查询
-
connect by prior:
- 指定递归条件以获取下一条记录
- prior的位置不同,会有不用的查询结果,详情可见下边的例子。
-
-
-
对male_familys进行层次化查询
-
-
层次关系图如下:
-
prior放置位置-(自顶向下)例:
-
查询爷爷的子孙信息
- select * from male_familys start with person=‘爷爷’ connect by prior person_id= father_id;
-
-
-
查询爸爸的子孙信息
- select * from male_familys start with person=‘爸爸’ connect by prior person_id= father_id;
-
-
-
查询我的子孙信息
- select * from male_familys start with person=‘我’ connect by prior person_id= father_id;
-
-
-
-
prior放置位置-(自顶向上)例:
-
查询爸爸及直系亲属长辈信息
- select * from male_familys start with person=‘爸爸’ connect by person_id=prior father_id;
-
-
查询姐姐及直系亲属长辈信息
- select * from male_familys start with person=‘姐姐’ connect by person_id=prior father_id;
-
-
-
查询孙子及直系亲属长辈信息
- select * from male_familys start with person=‘孙子’ connect by person_id=prior father_id;
-
-
-
-
注:仔细对照prior放置位置不同,搜索结果也不同!做个勤于思考的人…
-
层次化查询的相关函数
-
sys_connect_by_path(列名,分隔符)
- 对起始至当前记录之间的结果集进行聚合操作。该操作仅限于串联字符串
- 其中:列名指定那个列的值进行串联;分割符则指定字符串串联时的分隔符。
-
例
-
-
查询爷爷子孙信息,并将person列的值进行串联
-
select person_id,person,sys_connect_by_path(person,‘-’) person_path from male_familys start with person=‘爷爷’ connect by prior person_id = father_id;
-
-
-
-
注意:
- 层次化查询完全具备死循环的条件,使用时应悉知!