oracle中行转列函数
一、问题描述
有时在“相关子查询中”需要查询某个实体类对应的某个字段有多个值,如果不做行专列查询,会提示返回多个列的错误。例如:

如上图所示,一个组合包,可能对应多个产品,需要你将所对应的多个产品都放到前台显示。
二、解决方法
表结构设计如图:

首先,我们这里采用相关子查询的方式来获取结果:
组合包和产品是一对多的关系,故一个组合包可以对应多个产品:
select
(select listagg(pp.product_name,',') within group(order by pp.product_name)
from edu_group_product gpp,--组合包和产品关联表
edu_product pp--产品表
where gpp.group_id = gp.group_id
and gpp.product_id = pp.product_id
) products
from edu_group gp--组合包表
where gp.group_id = 1000;
查询时间:
该函数结构:
LISTAGG(字段名,分隔符) WITHIN GROUP( ORDER BY 字段名)
三、说明
1.想使用该函数,在本机的oracle上试了一会,发现总提示我“未找到要求的关键字”,反复核对关键字和字段名称,都无法解决。于是在服务器一个曾使用过该方法的表结构中尝试试用该方法,一次成功,瞬间明白可能是因为服务器版本不同的原因。一查果然啊:
select wm_concat(name) name from user;--10g写法
select listagg(name,',') within group (order by name) name from user;--11g写法
2.使用wm_concat后果
select
(select wm_concat(pp.product_name)from edu_group_product gpp,--组合包和产品关联表
edu_product pp--产品表
where gpp.group_id = gp.group_id
and gpp.product_id = pp.product_id
) products
from edu_group gp--组合包表
where gp.group_id = 1000;
同样的表结构,同样的查询要求,使用wm_concate()函数结果:

试了几次,最快是3秒多,大并发量下,要死人的。
同样,在10g的数据库中试用该方法耗时也很长。
oracle中行转列函数的更多相关文章
- oracle 行转列函数pivot和unpivot
今天接到业务部门的一个需求,需要对同一公司的不同财务指标进行排序,需要用到oracle的行转列函数unpivot. 财务报表的表结构为: 要实现业务部门的排序筛选功能,需要首先将行数据转为列数据: 使 ...
- oracle中行转列、列转行函数
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...
- oracle行转列函数WMSYS.WM_CONCAT 用法
1.通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果 select group_code, wm_concat(display_title) from DR_OPM ...
- Oracle中行转列,列转行pivot的用法
测试数据准备 --建表 --drop table SalesList; create table SalesList( keHu ), --客户 shangPin ), --商品名称 salesNum ...
- oracle行转列函数以及一些窗口函数(PIVOT ,OVER)
可以查看博客园上传的文件 pivot 除了要转成列的字段(classnum,classid)值不一样,其他值都应该相同,否则转的数据有问题
- oracle行转列函数
- oracle中行转列操作
数据准备阶段: CREATE TABLE CC (Student NVARCHAR2(2),Course NVARCHAR2(2),Score INT); INSERT into CC sele ...
- Oracle 行转列 动态出转换的列
本文链接:https://blog.csdn.net/Huay_Li/article/details/82924443 10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后, ...
- Oracle行转列,pivot函数和unpivot函数
pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)):unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 for ...
随机推荐
- 清除windows的EFS加密
所使用软件为aefsdr_setup_en,搜索名为advanced.efs.data.recovery 1. 创建需要加密的文件 2. 进行加密 ...
- 一个小makefile程序
刚刚开始学习linux下的程序,总需要自己写一些小型的makefile文件,这里给出一个makefile的例子,方便以后借鉴. 程序包含了main.c(需要头文件input.h 和 display.h ...
- 如何设置fedora默认从命令行启动?
Sumary:因为在fedora中没有/etc/initab文件我们不方便从这里设置它的runlevel target,但是linux又给我们提供了一个强悍的工具systemd,我们可以用system ...
- (转)HTML5游戏如何挣钱?2条经验让你每款赚3万刀
原文作者:Alexander Krug,是世界上最大的HTML5游戏平台的运营商SOFTGAMES的CEO. 现今苹果App Store当中的应用数量可以以海量来形容,最新发布的应用对排行榜的冲击力也 ...
- JDK 动态代理实现原理
一.引言 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象便能动态生成代理类.代理类会负责将所有方法的调用分派到委托对象上反射执行,在分派执行的过 ...
- 单元测试SimpleTest新手入门
最近学习单元测试,先用了下PHPunit,结果安装问题一大堆,于是立刻放弃改试simpletest,感觉简单多了.下面列出步骤. 1.下载simpletest(版本1.1.0), http://www ...
- php 文件上传类 实例分享
最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...
- ASP专栏——ASP生成静态文件(用于大量文章)
对于Web开发人员来说,生成静态文件这个概念并不陌生. 对于Web开发来说,如何能避免客户端访问时不停的查询数据库?现在比较常用的有两种方法,一种是使用缓存技术,将查询出来的结果缓存至缓存框架中,以后 ...
- Python中处理时间 —— time模块
time模块 time 模块可用来处理时间,详细的说明参考 time模块说明. 逝去的秒数 逝去的秒数表示从某个时间(Python中是"Thu Jan 1 07:00:00 1970&quo ...
- Ztack学习笔记(3)-系统启动分析
一 系统启动 //OSAL.cvoid osal_start_system( void ) { #if !defined ( ZBIT ) && !defined ( UBIT ) f ...