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的数据库中试用该方法耗时也很长。

   

时间: 2024-08-07 17:33:51

oracle中行转列函数的相关文章

Oracle行转列函数由wmsys.wm_concat到listagg的进化

测试表数据 select * from test01 ID    NAME 10    CLARK 10    KING 10    MILLER 20    ADAMS 20    FORD 20    JONES 20    SCOTT 20    SMITH 30    ALLEN 30    BLAKE 30    JAMES 30    MARTIN 30    TURNER 30    WARD 1.wmsys.wm_concat用法(在10g下) 这个函数很常见,但Oracle官方

oracle行转列函数

Oracle将一列分成多列

Oracle将一列分成多列 在Oracle中,我们可以使用listagg(Oracle 11g及以上)将多行合并成中的某一列合并成一列,现在我们的需求是将一列分割成多列. 先建立一张表,插入测试数据: CREATE TABLE CELEBRITY( NAME VARCHAR2(100) ); INSERT INTO CELEBRITY VALUES ('Stephen King'); INSERT INTO CELEBRITY VALUES ('Tom Hanks'); INSERT INTO

oracle行转列

针对oracle数据查询的数据,行转列 1.wm_concat函数: 例一: select c1,c2,wm_concat(c3) from T where.... group by c1,c2 查询结果自动用","分割 例二: select c1,c2,wm_concat(c3)over(partition by ..order by..) from T where.... 其中,partition用来分组, order用来排序 2.sys_connect_by_path函数: 这个

oracle中的聚合函数count、max、min、sum、avg以及NVL函数的用法

oracle中的聚合函数count.max.min.sum.avg以及NVL函数的用法 分组函数聚合函数对一组行中的某个列执行计算执行计算并返回单一的值.聚合函数忽略空值.聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用,所以有的时候也把其称之为分组函数.这类函数通常应用于报表统计中,以下展示Oracle常用的聚合函数的应用. 分组函数的介绍 作用于一组数据,并对一组数据返回一个值. 常见的分组函数有: Count 用来计算有效数据的数量 Min 返回一个数字列或计算列的最小

oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了

众所周知,静态SQL的输出结构必须也是静态的.对于经典的行转列问题,如果行数不定导致输出的列数不定,标准的答案就是使用动态SQL, 到11G里面则有XML结果的PIVOT. 但是 oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了.上代码 直接点. CREATE OR REPLACEtype PivotImpl_shx as object( ret_type anytype, -- The return type of the table function stmt varc

Oracle 11g 虚拟列 Virtual Column介绍

Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL] 1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用于DML语句 2.可以基于虚拟列来做分区 3. 可以在虚拟列上建索引,o

Oracle行转列操作

有时候我们在展示表中数据的时候,需要将行转为列来显示,如以下形式: 原表结构展示如下:---------------------------产品名称    销售额     季度---------------------------奶酪          50     第一季度奶酪          60     第二季度啤酒          50     第二季度啤酒          80     第四季度--------------------------- 现在需要将上面的原表结构转换为

oracle中的常用函数

oracle中的常用函数 1. 字符串常用函数 函数名 说明 concat 用来连接字符串的函数,只能连接两个字符串.如果想连接多个字符串可以使用"||"符号 initcap 把每个单词的首字母大写. instr(‘母字符串’,‘子字符串’) 母字符串:被查找的字符串.子字符串:要查找的字符串. 如果有第三个参数,代表从第几个字符开始查找. 第四个参数代表查询第几次出现的字符串的下标,默认是1. 查询不到返回0 select instr('410106199012132018','19