假如有如下表,其中各个i值对应的行数是不定的
SQL> select * from t;
I A D
---------- ---------- -------------------
1 b 2008-03-27 10:55:42
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59
要获得如下结果,注意字符串需要按照D列的时间排序:
1 d,b,a
2 z,t
这是一个比较典型的行列转换,有好几种实现方法
1.自定义函数实现
create or replace function my_concat(n number)
return varchar2
is
type typ_cursor is ref cursor;
v_cursor typ_cursor;
v_temp varchar2(10);
v_result varchar2(4000):= '';
v_sql varchar2(200);
begin
v_sql := 'select a from t where i=' || n ||' order by d';
open v_cursor for v_sql;
loop
fetch v_cursor into v_temp;
exit when v_cursor%notfound;
v_result := v_result ||',' || v_temp;
end loop;
return substr(v_result,2);
end;
SQL> select i,my_concat(i) from t group by i;
I MY_CONCAT(I)
---------- --------------------
1 d,b,a
2 z,t
虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。
2.使用sys_connect_by_path
从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:
3.使用wmsys.wm_concat
这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序
SQL> select i,wmsys.wm_concat(a) from t group by i;
I WMSYS.WM_CONCAT(A)
---------- --------------------
1 b,a,d
2 z,t
SQL> select i,wmsys.wm_concat(a) from (select * from t order by i,d) group by i;
I WMSYS.WM_CONCAT(A)
---------- --------------------
1 d,b,a
2 z,t
执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。
不知道大家还有没有更加高效的实现方式,欢迎指教^_^
其他一些方法,可以参考:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:15637744429336
分享到:
相关推荐
oracle行列转换,通过实例来实现表的行列转换
oracle sql行列转换
Oracle行列转换,一个挺经典的例子,值得学习和思考……
本例子主要是实现了oracle行列的转换,这个挺有用的
oracle行列转换
oracle的行列转换例子,行转列,列转行。主要针对oracle10g
ORACLE 行列转换,ORACLE,行列转换
oracle行. 列转换的总结。。。。。。。。。。。。
主要介绍了Oracle实现行列转换的方法,结合实例形式分析了Oracle针对固定列、不定列、列数不固定等情况下的行列转换操作技巧,需要的朋友可以参考下
本人在工作中遇到了涉及到数据库行列之间相互转换的问题,在网上搜索了很久也没有一个比较完整的解释,通过本人自己的摸索测试,整理出来了Oracle中SQL语句行列之间相互转换的资料,大家可以下载学习。
oracle知识列点 一个简单的行列转换例子,需要的可以看下
常见的数据库面试关于行转列列转行的操作,方便你的面试,经常考到的
oracle行列转换示例,查询转换,有创表过程,数据,清晰明了
NULL 博文链接:https://yxw22.iteye.com/blog/1988998
分别讲述了SQLServer和Oracle行列转换的两种方式,可以通过SQL实现,也可通过关键字搞定; 还可以看到Oracle与SQLServer关键字用法的差异。
Oracle 行列转换 总结 很实用的一个文档。
VC 几种连接ORACLE的方法VC 几种连接ORACLE的方法VC 几种连接ORACLE的方法VC 几种连接ORACLE的方法VC 几种连接ORACLE的方法