将一列多行转为一个字符串连接显示,oracle该如何实现,如下的例子:
create table stu(stuid int, stuname varchar2(32));
create table cls(stuid int, clsname varchar2(32));
insert into stu values(1, '张三');
insert into stu values(2, '李四');
insert into stu values(3, '王五');insert into cls values(1, '语文');
insert into cls values(1, '数学');
insert into cls values(3, '语文');
insert into cls values(3, '英语');
insert into cls values(3, '物理');我查询学生选了哪些课程,结果为---------------------------------------------------------
stuid stuname clsname
1 张三 语文,数学
2 李四
3 王五 语文,英语,物理我使用sys_connect_by_path函数来实现,有问题,请高手指导一下,谢谢了!!!
select stuid, stuname, (select max(substr(sys_connect_by_path(clsname,','),2))
from (select clsname,rownum rn from cls where stuid=stu.stuid) start with rn=1 connect by rn=rownum) clsname
from stu;
create table stu(stuid int, stuname varchar2(32));
create table cls(stuid int, clsname varchar2(32));
insert into stu values(1, '张三');
insert into stu values(2, '李四');
insert into stu values(3, '王五');insert into cls values(1, '语文');
insert into cls values(1, '数学');
insert into cls values(3, '语文');
insert into cls values(3, '英语');
insert into cls values(3, '物理');我查询学生选了哪些课程,结果为---------------------------------------------------------
stuid stuname clsname
1 张三 语文,数学
2 李四
3 王五 语文,英语,物理我使用sys_connect_by_path函数来实现,有问题,请高手指导一下,谢谢了!!!
select stuid, stuname, (select max(substr(sys_connect_by_path(clsname,','),2))
from (select clsname,rownum rn from cls where stuid=stu.stuid) start with rn=1 connect by rn=rownum) clsname
from stu;
解决方案 »
- oracle导入数据库成功 但是没有表空间
- !!!!! 求 oracle11g RAC相关知识的中文资料^^^^^^^^^
- 存储过程报错了瞧一下
- 请教一个关于分布式数据库的问题
- 在linux中对oracle进行定时dmp ,如何按日期给生成的文件命名
- 在线求助, oracle sql监测问题
- 怎么样把一个很多的数据导入我的数据表
- 请问在Solaris8下安装Oracle9i后,如何将数据库的启动和关闭加入到系统的启动和关闭脚本中去
- 如何实现类似于两次select语句执行后的结果合并?
- PL/SQL导入dmp文件
- 如何获取一张未知的表中的所有字段
- ORACLE 的DBMS_METADATA.GET_DDL()导出结构
select stu.stuid,
stu.stuname,
wm_concat(cls.clsname)
from stu,cls
where stu.stuid=cls.stuid
group by stu.stuid,stu.stuname--或者(未测试)
select stuid,
stuname,
replace(substr(max(sys_connect_by_path(clsname,';')),2),';','') newname
from (select stuid,
stuname,
clsname,
rn,
lead(rn) over(partition by stuid,stuname order by rn) rn1
from (select stu.stuid,
stu.stuname,
cls.name,
rownum rn
from cls,stu
where cls.stuid=stu.stuid)
)
start with rn1 is null
connect by rn1=prior rn
group by stuid,stuname
create table stu(stuid int, stuname varchar2(32));
create table cls(stuid int, clsname varchar2(32));
insert into stu values(1, '张三');
insert into stu values(2, '李四');
insert into stu values(3, '王五');insert into cls values(1, '语文');
insert into cls values(1, '数学');
insert into cls values(3, '语文');
insert into cls values(3, '英语');
insert into cls values(3, '物理');select s.stuid, s.stuname, wm_concat(c.clsname)
from stu s, cls c
where s.stuid = c.stuid
group by s.stuid, s.stuname
1 张三 语文,数学
3 王五 语文,物理,英语
create table stu(stuid int, stuname varchar2(32));
create table cls(stuid int, clsname varchar2(32));
insert into stu values(1, '张三');
insert into stu values(2, '李四');
insert into stu values(3, '王五');insert into cls values(1, '语文');
insert into cls values(1, '数学');
insert into cls values(3, '语文');
insert into cls values(3, '英语');
insert into cls values(3, '物理');select s.stuid, s.stuname,wm_concat(c.clsname)
from stu s, cls c
where s.stuid= c.stuid(+)
group by s.stuid, s.stunames.stuid s.stuname wm_concat(c.clsname)
1 张三 语文,数学
2 李四
3 王五 语文,物理,英语
(select max(substr(sys_connect_by_path(clsname,','),2))
from (select clsname,rownum rn from cls where stuid=stu.stuid) start with rn=1 connect by rn=rownum) clsname
LZ, 你上面的报错的因为在标量子查询里面有嵌套了子查询,
所以识别不了 stu这个表名了
改成下面这个就可以了SELECT stuid
,stuname
,(SELECT MAX(substr(sys_connect_by_path(clsname, ','), 2))
FROM (SELECT clsname
,stuid
,row_number() over(PARTITION BY stuid ORDER BY clsname) rn
FROM cls) t
START WITH rn = 1
AND t.stuid = v.stuid
CONNECT BY rn = PRIOR rn + 1
AND stuid = PRIOR stuid
GROUP BY stuid --必须要加这个GROUP BY,负责会报错,估计是9i的BUG
) clsname
FROM stu v;或者可以使用 自定义函数 ,更简单一些
SELECT stuid
,stuname
,(SELECT stragg(clsname || ',') FROM cls t WHERE t.stuid = v.stuid) clsname
FROM stu v;