oracle把多行合并成字符串,怎样将Oracle多行转换成字符串?

在做一些比较复杂的DB数据导出时,有时会要求“将不固定的多行数据组合成一个字符串返回”。

例子:ISV Portal中就遇到了类似的情况,要求对于每一个APP,返回其所属的所有类目名称,类目名称之间用[,]隔开。

本文就用此例子来介绍。在具体陈述实现方案之前,我们先介绍下我们即将操作的表结构:

SQL> desc app_category_link;

Name Type Nullable Default Comments

APP_CATEGORY_LINK_ID VARCHAR2(20) 主关键

APP_ID VARCHAR2(20) 应用ID

APP_CATEGORY_ID VARCHAR2(20) 应用类别ID

其中字段APP_ID和APP_CATEGORY_ID是一对多关系;

对于该类型的问题,总结一下大致有如下几种常见方案:

方案1:sys_connect_by_path + start with 。

。。 connect by 。。。 prior + 分析函数

从上面的这个公式中我们可以看出,该方案主要是通过分析函数和父子级联查询来完成,一般是一条SQL搞定,比较省事。首先来看几个具体的实现SQL。

具体实现1:

SELECT app_id,

ltrim(max(sys_connect_by_path(app_category_id, ',')), ',') categ_ids

FROM (SELECT app_id,

app_category_id,

app_category_id || '|' || rn rchild,

app_category_id || '|' || (rn - 1) rfather

FROM (SELECT app_id,

app_category_id,

row_number() over(PARTITION BY app_id ORDER BY app_category_id) rn

FROM app_category_link))

START WITH rfather LIKE '%|0'

CONNECT BY PRIOR rchild = rfather

GROUP BY app_id;

具体实现2:

select app_id,

ltrim(max(sys_connect_by_path(app_category_id, ',')), ',') categ_ids

from (select t。

app_id,

t。app_category_id,

min(t。app_category_id) over(partition by app_id) categ_min,

(row_number() over(order by app_id, app_category_id)) +

(dense_rank() over(order by app_id)) numid

from app_category_link t)

start with app_category_id = categ_min

connect by numid - 1 = prior numid

group by app_id;

具体实现3:

select app_id,

ltrim(max(sys_connect_by_path(app_category_id, ',')), ',') categ_ids

from (select t。

app_id,

t。app_category_id,

(row_number()

over(partition by app_id order by app_category_id)) numid

from app_category_link t)

start with numid = 1

connect by numid - 1 = prior numid

and app_id = prior app_id

group by app_id;

具体实现4:

select app_id,

ltrim(sys_connect_by_path(app_category_id, ','), ',') categ_ids

from (select t。

app_id,

t。

app_category_id,

(row_number()

over(partition by app_id order by app_category_id)) numid

from app_category_link t)

WHERE connect_by_isleaf = 1

start with numid = 1

connect by numid - 1 = prior numid

and app_id = prior app_id;

请注意看4种实现方式的区别,下面分别介绍下这4种实现方式的具体思路;

第1种实现采用了1个分析函数、2次子查询、一个like、以及父子级联查询字段值连接;可以猜测下性能肯定不咋的,2次子查询本来已经很耗时了,对查询出来的结果集还要用like匹配,速度就更慢了,此法可以查询到我们需要的具体数据,但是效率很低,不可取;他的实现思路是利用待查询字段值与各APP下面各类目ID的序列值进行组合,并作为父子关系级联的依据;

第2种实现采用了3个分析函数、1次全表扫描、以及父子级联字段值连接;和第1种实现比较而言的话效率会高不少;他的实现思路是利用各APP对应的最小类目ID作为父子级联的开始点,而父子级联的依据是row_number()+dense_rank(),这样做主要是为了避免无限循环;

3、4两种实现思路基本上是一样的,都是1个分析函数、1次全表扫描、以及父子级联字段值连接;从代码长度来说,比前2种实现方式简洁了不少,思路也清晰了很多,直接利用各APP对应类目ID的序列值作为父子级联的开始点和连接依据;但仔细看看两者的SQL,会发现第3这种方式用到了group by子句,而第4种实现却没有用到,而是在where子句中添加了connect_by_isleaf = 1 的查询条件;从性能上来看,应该是第4种实现方式更高,但他只能在10g及其以后的版本中才能使用,connect_by_isleaf 字段是10g中新提供的一个伪列,他可以用来判断该条记录是否是树形记录的叶节点,不过还在用9i版本的可能就有些可惜了;

综合以上分析,对4种实现方案,个人推荐使用第

3、4两种实现方式,具体哪种可以看所用oracle的版本而定,简而言之,这种实现方式优雅、简洁、高效;。

全部

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openshift使用_OpenShift v3:使用WildFly和MySQL的Java EE 7入门

openshift使用OpenShift是Red Hat的开源PaaS平台。 OpenShift v3 (将于今年发布)将提供使用Docker和Kubernetes运行微服务的整体体验。 以经典的Red Hat方式,所有工作都在OpenShift Origin的开源中完成。 这也将推动OpenShift Online和OpenSh…

c程序的基本组成单位是什么?

C程序是由函数构成的。函数是C程序的基本组成单位。一个C源程序中仅有一个main()函数,除main函数之外可以有若干个其它的函数。每个函数实现某一特定的操作。因此,函数是C程序的基本单位。一个函数由两部分组成:函数的说明部分。包括函数名、函数类型、函…

java多线程 异常处理_Java8多线程ForkJoinPool:处理异常

java多线程 异常处理引入Java8 lambda背后的主要动机之一是能够尽可能轻松地使用多核的能力(请参阅精通Lambdas:多核世界中的Java编程 )。 只需将代码从collection.stream()...更改为collection.parallelStream()...您就可以使用即时多线程&a…

C语言头文件 “ 细节 ”

很多事不深入以为自己懂了,但真正用到项目上,才发现了问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。(毕竟刚毕业时老大对我最初的训练就是编码格式的规范化处…

订阅号微信公众号历史文章爬虫php,一步步教你怎么打造微信公众号历史文章爬虫...

原标题:一步步教你怎么打造微信公众号历史文章爬虫开篇语:邓爷爷曾说过:不管黑猫白猫,逮到耗子就是好猫。不管我是凑的还是笨办法堆出来的,确实把批量导出微信公众号所有历史文章的这个功能给做出来了,而且…

oracle中悲观锁定_如何使用悲观锁定修复乐观锁定竞争条件

oracle中悲观锁定回顾 在我以前的文章中 ,我解释了使用显式乐观锁定的好处。 然后我们发现,在很短的时间范围内,并发交易仍可以在我们当前交易被提交之前立即提交产品价格更改。 此问题可以描述如下: 爱丽丝拿产品 然后&#…

初学者宝典:C语言入门基础知识大全(中)

04常量在程序运行中,其值不能被改变的量称为常量。常量有5种类型:整型常量、实型常量、字符常量、字符串常量和符号常量。4.1 数值转换—数值的四种表现形式:①:二进制:所有数字由0,1构成,逢二进一&#xf…

linux命令创建硬链接,Linux终端命令接口(十一)硬链接与软连接

一、进入终端 输入 使用 ls -l 即可.示例:$ touch file1 # 创建新文件 file1$ touch file2 # 创建新文件 file2$ ln file1 file3 # 为 file1 创建硬链接 file3$ ls -ltotal 0-rw-r--r-- 2 root root 0 01-25 16:59 file1-rw-r--r-- 1 root root 0 01-25 17:00 f…

stateless_Spring Stateless State Security第3部分:JWT +社会认证

stateless我的Stateless Spring Security系列文章的第三部分也是最后一部分是关于将基于JWT令牌的身份验证与spring-social-security混合在一起的。 这篇文章直接建立在它的基础上,并且主要集中在已更改的部分上。 想法是使用基于OAuth 2的“使用Facebook登录”功能…

return在c语言中是什么意思

函数是C语言的基本构件,一个C程序可以由一个主函数和若干个子程序函数构成,由主函数调用其它子程序函数,其他子程序函数也可以互相调用。通常希望通过函数调用使主函数能得到一个确定的值,这就是函数的返回值。在C语言中通过函数实…

为什么非阻塞io性能更好_提高性能:流的非阻塞处理

为什么非阻塞io性能更好1.简介 想象一下,我们有一个需要访问外部Web服务的应用程序,以便收集有关客户端的信息,然后对其进行处理。 更具体地说,我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端,则…

linux history文件路径,Linux、Unix常用命令(文件和目录相关)

mkdir dirname 建立子目录. 注意:用户不能在一个不存在的目录中建立子目录。mkdir data 在当前目录下建立子目录 datamkdir /usr/data 在/usr/目录下建立子目录 data,此时/usr 目录必须已经存在。rmdirrmdir dirname 删除空目录,目录里面如有文件或目录则…

c语言的输入函数有哪些

c语言的输入函数有:1、scanf的返回值scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。如:scanf("%d%d", &a, &b);如果a和b都被成功读入,那么scanf的返回值就是2如果只有a被成功读入&#xff0…

php cdi_CDI和EJB:在事务成功时发送异步邮件

php cdi再次问好! :) 这次,我选择了一项常见任务,我认为大多数情况下都以错误的方式完成:发送电子邮件。 并非所有人都不知道电子邮件API的工作方式,例如JavaMail或Apache的commons-email 。 我通常看到的一个问题是&…

linux中多进程调试,linux下用gdb调试多进程

今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表:这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的。一、多进程调试的命令1、set follow-fork-mode parent|child因为gdb在一般情况下,只…

初学者宝典:C语言入门基础知识大全(下)

06类型的自动转换和强制转换当同一表达式中各数据的类型不同时&#xff0c;编译程序会自动把它们转变成同一类型后再进行计算。转换优先级为&#xff1a;char < int < float < double 即左边级别“低“的类型向右边转换。具体地说&#xff0c;若在表达式中优先级最高的…

linux接口 头文件,第一种:1、添加关键头文件:#include linux/of_gpio.h#include linux/gpio.h...

第一种&#xff1a;1、添加关键头文件&#xff1a;#include #include #include #include #include #include 2、在已经存在驱动文件中搜索"DEVICE_ATTR"关键字&#xff0c;如果存在&#xff0c;直接参考已经存在的方法添加一个即可&#xff0c;如下&#xff1a;unsig…

viewpager默认界面_使用默认方法的界面演变–第一部分:方法

viewpager默认界面几周前&#xff0c;我们详细研究了默认方法 -Java 8中引入的一项功能&#xff0c;该功能允许为接口方法提供实现&#xff0c;即方法主体&#xff0c;从而定义接口中的行为。 引入此功能是为了实现接口演进 。 在JDK的上下文中&#xff0c;这意味着在不破坏所…

C语言中scanf函数的3种常见问题与应对技巧

在写代码时难免对一些知识点不熟悉&#xff0c;导致犯错&#xff0c;今天分享几点小知识给大家。空白符问题#includeint main(void){int a;printf("input the data ");scanf("%d ",&a); //这里多了一个回车符printf("%d",a);return 0;}结果…

jpa和hibernate_JPA和Hibernate级联类型的初学者指南

jpa和hibernate介绍 JPA将实体状态转换转换为数据库DML语句。 由于对实体图进行操作很常见&#xff0c;因此JPA允许我们将实体状态更改从父级传播到子级 。 通过CascadeType映射配置此行为。 JPA与Hibernate级联类型 Hibernate支持所有JPA级联类型和一些其他旧式级联样式。 下…