`

网上看到的,Oracle一个典型的行列转换实现,找时间在9I和10G上去测试下效果

阅读更多

原文地址:http://www.ningoo.net/html/2008/how_to_do_string_aggregate_on_oracle.html

Oracle一个典型行列转换的几种实现方法

作者:NinGoo | 【转载须以超链接形式标明文章原始出处和作者信息】

<script type="text/javascript">&lt;!-- google_ad_client = &quot;pub-5453951276515381&quot;; /* 728x90, 创建于 08-8-4 */ google_ad_slot = &quot;6748094299&quot;; google_ad_width = 728; google_ad_height = 90; //--&gt; </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script>google_protectAndRun(&quot;ads_core.google_render_ad&quot;, google_handleError, google_render_ad);</script>

假如有如下表,其中各个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

select i,ltrim(max(sys_connect_by_path(a,’,')),’,') a
from
(
select i,a,d,min(d) over(partition by i) d_min,
(row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
from t
)
start with d=d_min connect by numid-1=prior numid
group by i;

从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:
eplan1

3.使用wm_sys.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)
2 from
3 (select * from t order by i,d)
4 group by i;

I WMSYS.WM_CONCAT(A)
———- ——————–
1 d,b,a
2 z,t

执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。

不知道大家还有没有更加高效的实现方式,欢迎指教^_^

分享到:
评论

相关推荐

    Oracle 9i10g 数据库管理详细

    - **Oracle 10g** 在9i的基础上进一步增强了可用性和性能,特别是通过Grid Computing技术实现了更高级别的资源管理和优化。 #### 二、Oracle 9i/10g 日常管理基础 - **日常管理内容** 包括但不限于:数据库启动和...

    oracle 9i & 10g

    Oracle数据库是全球广泛使用的大型企业级关系型数据库管理系统之一,其9i和10g版本在21世纪初尤其流行。这两个版本引入了许多创新特性,增强了数据库的性能、可用性和可扩展性。以下是对"Expert Oracle Database ...

    Oracle 9i 10g 11g odbc driver数据库连接驱动

    ODBC提供了一种标准化的方法,使得开发者可以通过SQL来访问各种数据库,包括Oracle 9i、10g和11g版本。 Oracle 9i ODBC驱动程序是针对Oracle 9.2版数据库设计的,它支持JDBC(Java Database Connectivity)和ODBC...

    oracle9i10g编程艺术.rar

    Oracle 9i与10g是Oracle数据库的两个重要版本,它们在数据库管理、SQL查询、存储过程编写、性能优化等方面都有丰富的知识等待探索。Oracle数据库是全球广泛使用的大型关系型数据库系统,尤其在企业级应用中占据主导...

    Oracle 9i、10g、11g通用jdbc驱动包

    Oracle 9i、10g、11g通用JDBC驱动包是Oracle公司为Java开发者提供的数据库连接驱动,使得Java应用程序能够与Oracle数据库进行交互。这些驱动程序遵循Java Database Connectivity (JDBC) API规范,是Java平台上的标准...

    oracle10g数据导入到oracle9i解决方案

    - **确保视图可用**:在创建视图后,需要确保这个视图在Oracle 9i和Oracle 10g中都是可用的。这通常可以通过查看`user_views`视图来实现。 完成上述步骤后,就可以使用Oracle 9i客户端的exp命令来导出数据了。例如...

    Oracle 9i&10g 编程艺术

    《Oracle 9i&10g 编程艺术》是一本专为数据库开发人员精心编写的经典技术书籍,它深入浅出地介绍了Oracle 9i和10g这两个版本的编程技术和最佳实践。Oracle数据库是全球广泛使用的数据库管理系统之一,尤其在企业级...

    Oracle Database Architecture 9i and 10g Programming Techniques and Solutions

    Oracle数据库架构9i和10g是Oracle公司在21世纪初发布的两个重要版本,它们在数据库管理和编程领域具有深远的影响。这两个版本引入了许多创新技术,为数据库管理员(DBA)和开发人员提供了更高效、更可靠的数据库解决...

    Oracle+9i&10g;编程

    Oracle 9i与10g是Oracle数据库的两个重要版本,它们在数据库管理、性能优化、安全性以及可扩展性方面都有着显著的改进。这两个版本的出现推动了企业级数据库技术的发展,尤其对于大型企业和互联网应用提供了强大的...

    Oracle+9i&10g编程艺术.rar

    本资源包"Oracle+9i&10g编程艺术.rar"聚焦于Oracle 9i和10g这两个版本,涵盖了数据库的设计、开发、管理和优化等多个方面。下面将对这两个版本的Oracle数据库进行详细的解析,并探讨其编程艺术。 Oracle 9i,全称为...

    Oracle9i&10g编程艺术脚本

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其9i和10g版本在2000年代初期至中期是企业级应用的主流选择。"Oracle9i&10g编程艺术脚本"这个主题主要涵盖了这两代产品中的SQL语言、PL/SQL编程以及相关的...

    Oracle CDC 数据同步9i/10G

    本篇文章将深入探讨 Oracle CDC 在 9i 和 10g 版本中的应用和关键知识点。 1. **CDC 概念**: - CDC 是 Change Data Capture 的缩写,它捕获并存储自上次同步以来数据库中发生的更改,而不是重新获取整个数据集。 ...

    oralce 9i与10g共存安装

    本篇文章将详细探讨如何在Windows环境下实现Oracle 9i和10g的共存安装。 首先,安装顺序至关重要。按照最佳实践,应先安装较旧的Oracle 9i,然后再安装更新的Oracle 10g。这是因为新版本的Oracle通常能够兼容旧版本...

    oracle+8i-9i-10g-11g区别.

    Oracle数据库的版本更新带来了许多重要的技术创新和改进,从8i到9i,再到10g,最后到11g,每个版本都提升了系统的性能、可用性、管理便捷性及安全性。下面将详细介绍这些版本之间的主要差异和新特性。 首先,Oracle...

    Oracle_Database_9i10g11g编程艺术

    《Oracle_Database_9i10g11g编程艺术》是针对Oracle数据库系统的一本深入解析书籍,主要涵盖了从9i到11g版本的编程技术和数据库体系结构。Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用...

    Oracle+9i&10g;编程艺术:深入数据库体系结构电子书

    《Oracle+9i&10g编程艺术:深入数据库体系结构》是一本专注于Oracle数据库系统核心技术的专著,尤其针对9i和10g版本进行了深入解析。这本书旨在帮助读者理解Oracle数据库的内部工作原理,提升数据库管理和开发的技能...

    Oracle9i、10g、11g编程艺术(中文版).pdf

    Oracle9i、10g、11g编程艺术(中文版).pdf

    Oracle Database 9i/10g/11g编程艺术深入数据库体系结构2.pdf

    Tom经典大作,Oracle Database 9i/10g/11g编程艺术深入数据库体系结构中文版

    oracle 9i-10g-11g jdbc jar包

    在Oracle 9i、10g和11g这三个版本中,JDBC驱动经历了不同的发展阶段,提供了多种类型和级别的支持。这些版本的JDBC驱动主要分为四种类型: 1. Type 1( Thin Driver):这是一个纯Java驱动,不依赖于任何操作系统或...

    Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构(第2版)

    《Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构(第2版)》是一本专为Oracle数据库开发者和管理员精心编写的权威指南。这本书全面覆盖了Oracle数据库9i、10g和11g版本的核心技术和最佳实践,旨在帮助...

Global site tag (gtag.js) - Google Analytics