Oralce的SYS_CONNECT_BY_PATH函数使用实例

实例一:

在Oracle中,SYS_CONNECT_BY_PATH函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示。

 1 -- 创建一个内容表 
2 create table t_student
3 (
4 t_id number,
5 t_class number,
6 t_name varchar2(10),
7 t_subject varchar2(1000),
8 t_score number
9 );
10
11 -- 插入测试数据
12 insert into t_student values (1, 1001, 'aaa', '英语', 90);
13 insert into t_student values (2, 1001, 'aaa', '数学', 50);
14 insert into t_student values (3, 1001, 'bbb', '语文', 60);
15 insert into t_student values (4, 1001, 'bbb', '化学', 88);
16 insert into t_student values (5, 1001, 'ccc', '物理', 75);
17 insert into t_student values (6, 1001, 'ccc', '英语', 100);
18 commit;
19
20 -- 第一种结果
21 select t_name, ltrim(max(sys_connect_by_path(str, ',')), ',') b
22 from (select stu.t_name,
23 (stu.t_subject || ':' || stu.t_score) str,
24 row_number() over(partition by stu.t_name order by stu.t_subject desc) rn
25 from t_student stu)
26 start with rn = 1
27 connect by rn - 1 = prior rn
28 and t_name = prior t_name
29 group by t_name;

 1 -- 第二种结果
2 select t_class, max(substr(str, 2)) str
3 from (select t_class, sys_connect_by_path(str, ';') str
4 from (select t_class,
5 str,
6 t_class || rn rchild,
7 t_class || (rn - 1) rfather
8 from (select o.t_class,
9 (o.t_name || '(' || o.t_subject || ':' || o.t_score || ')') str,
10 row_number() over(partition by o.t_class order by o.t_subject || o.t_score) rn
11 from t_student o
12 where o.t_name || o.t_score is not null))
13 connect by prior rchild = rfather
14 start with rfather like '%0')
15 group by t_class;

其中,SYS_CONNECT_BY_PATH函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示。

row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。生产序号的方法通过over()函数里面的语句来控制。

 

实例二:

Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行。其语法一般为:

       select ... sys_connect_by_path(column_name,'connect_symbol')  from table

       start with ... connect by ... prior

依托于该语法,我们可以将一个表形结构以树的顺序列出来。在下面列述了Oracle中树型查询的常用查询方式以及经常使用的 与树查询相关的Oracle特性函数等,在这里用oracle自带的emp数据表做测试。

 查找一个员工的所有下属员工。

   在树形结构中即查找一个节点的所有直属子节点(所有后代)。

1 -- 用scott,或是sys用户执行
2 select ename
3 from scott.emp
4 start with ename = 'KING'
5 connect by prior empno = mgr;

1 select sys_connect_by_path(ename, '>') "path"
2 from scott.emp
3 start with ename = 'KING'
4 connect by prior empno = mgr;

对于数据库来说,根节点并不一定是在数据库中设计的顶级节点,而是start with开始的地方。

sys_connect_by_path函数就是从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串,这个功能还是很强大的。

sys_connect_by_path函数用connect by来寻找下一条记录,直到迭代找不到相应记录为止。概念与递归类似,connect by指定递归(连接)条件,如果条件不满足则递归结束。

level: 在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 

connect_by_root:用在列名之前,记录的是当前层的根节点内容。 
connect_by_isleaf:
判断当前节点是否包含下级节点,如果包含的话,说明不是叶子节点,这里返回0;反之,如果不包含下级节点,这里返回1。

posted @ 2012-02-09 15:53  cczz_11  阅读(973)  评论(0编辑  收藏  举报