最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Oracle同行合并分组

来源:动视网 责编:小采 时间:2020-11-09 11:37:53
文档

Oracle同行合并分组

Oracle同行合并分组:Oracle同行合并分组,使用函数sys_connect_by_path(column, Oracle同行合并分组 使用函数sys_connect_by_path(column,'')的例子^^。 表结构为: create table test( bookid char(3) not null, author varch
推荐度:
导读Oracle同行合并分组:Oracle同行合并分组,使用函数sys_connect_by_path(column, Oracle同行合并分组 使用函数sys_connect_by_path(column,'')的例子^^。 表结构为: create table test( bookid char(3) not null, author varch


Oracle同行合并分组,使用函数sys_connect_by_path(column,

Oracle同行合并分组
使用函数sys_connect_by_path(column,'')的例子^^。

表结构为:

create table test(

bookid char(3) not null,

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');

commit;

select * from test;

显示结果为:

BOO AUTHOR

-----------------

001 jack

001 tom

002 wang

002 zhang

002 li

我们想得到的结果为:

BOO AUTHOR

-----------------------------

001 jack&&tom

002 wang&&zhang&&li

SQL文为:

select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author

from

(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))

start with pid is null

connect by prior id=pid

group by bookid;

详细解释:

sys_connect_by_path(column,'')//column为列名,''中间加要添加的字符

这个函数本身不是用来给我们做结果集连接的(合并行),,而是用来构造树路径的,所以需要和connect by一起使用。

test只是张普通表,怎样才能变成树结构呢?我们需要加一个pid和id。

id我们只需加一个rownum就好。

select bookid,author,rownum id from test;

BOO AUTHOR ID

----------------------------

001 jack 1

001 tom 2

002 wang 3

002 zhang 4

002 li 5

而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);

BOO AUTHOR ID PID

-------------------------------------------

001 jack 1

001 tom 2 1

002 wang 3 2

002 zhang 4 3

002 li 5 4

由于要按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);

BOO AUTHOR ID PID

-------------------------------------------

001 jack 1

001 tom 2 1

002 wang 3

002 zhang 4 3

002 li 5 4

文档

Oracle同行合并分组

Oracle同行合并分组:Oracle同行合并分组,使用函数sys_connect_by_path(column, Oracle同行合并分组 使用函数sys_connect_by_path(column,'')的例子^^。 表结构为: create table test( bookid char(3) not null, author varch
推荐度:
标签: 分组 合并 数据库
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top