Oracle同行合并分组
使用函数sys_connect_by_path(column,'')的例子^^。
author varchar2(10) not null
insert into test values('001','jack');
insert into test values('001','tom');
insert into test values('002','wang');
insert into test values('002','zhang');
insert into test values('002','li');
-----------------------------
select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author
(select bookid,author,id,lag(id) over(partition by bookid order by id) pid
--(最后一列或者为)lead(id) over(partition by bookid order by id desc) pid
from (select bookid,author,rownum id from test))
sys_connect_by_path(column,'')//column为列名,''中间加要添加的字符
这个函数本身不是用来给我们做结果集连接的(合并行),而是用来构造树路径的,所以需要和connect by一起使用。
test只是张普通表,怎样才能变成树结构呢?我们需要加一个pid和id。
select bookid,author,rownum id from test;
----------------------------
而pid上一条记录不就是下一条记录的父节点了。这里我们需要函数lag()取前记录,和lead()相对。
//把lag(id) over(order by id) pid改成lead(id) over(order by id desc) pid效果一样
select bookid,author,id,lag(id) over(order by id) pid
from (select bookid,author,rownum id from test);
-------------------------------------------
由于要按bookid分我们的pid,在分析函数over中我们需要加上partition by,一看下面结果我们就知道有什么不同了。
select bookid,author,id,lag(id) over(partition by bookid order by id) pid
from (select bookid,author,rownum id from test);
-------------------------------------------
继续,把上述看成一张虚拟表,用到我们的sys_connect_by_path函数取出想要的值。
sys_connect_by_path(column,'')
connect by 条件2(prior 子节点=父节点)
select bookid,sys_connect_by_path(author,'&&') author
(select bookid,author,id,lag(id) over(partition by bookid order by id) pid
from (select bookid,author,rownum id from test))
-----------------------------------
002 &&wang&&zhang&&li
OK,离我们的结果越来越近了,现在就是一般函数的应用了。
2,用substr(string,start,length)截掉前面多余的字符。//没第三参数默认取到结束
select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author
group by bookid;//详细sql文,一开始已给出!
------------------------------