合享奇迹:Oracle行数据合并的秘诀(oracle行数据合并)

合享奇迹:Oracle行数据合并的秘诀

业务需求中有时候会遇到需要将多行数据合并成单行数据的情况,本文就分享Oracle数据合并的秘诀有哪些,比如,利用Listagg聚合函数,XMLQuery操作和递归查询。

首先,介绍一下Oracle Listagg聚合函数,它能够将多行数据聚合成单行,并用逗号分隔。例如,有一张用户清单表,表中包含一组用户名:

USER_LIST

用户

——

Tom

Bob

John

可以将这三个用户的名称合并到一行,利用Listagg函数

SELECT

LISTAGG(USER_NAME, ‘,’) WITHIN GROUP(ORDER BY USER_NAME) AS USER_LIST

FROM USER_LIST

执行结果为:

USER_LIST

————————

Bob, John, Tom

其次,介绍一下XMLQuery操作,它能够将查询结果作为XML文档处理,并可以返回结果集中某一列的所有值:

SELECT

XMLCAST(XMLQUERY(‘for $i in //row

return concat(data($i/@*), ”,”)

ORDER BY $i/@USER_NAME’

passing XMLTYPE(

SELECT

USER_NAME

FROM

USER_LIST

FOR XML PATH (‘row’), ELEMENTS)

RETURNING CONTENT) AS VARCHAR2(200)) AS USER_LIST

执行结果为:

USER_LIST

————————

Bob,,John,,Tom

最后,介绍一下Oracle的递归查询,它能够实现递归的行转列的功能,允许我们将输入的多行合并成单行,同时可以指定把某一列的值合并起来,例如:

WITH

t AS (SELECT ‘Tom’ USER_NAME FROM DUAL

UNION ALL

SELECT ‘Bob’ USER_NAME FROM DUAL

UNION ALL

SELECT ‘John’ USER_NAME FROM DUAL)

SELECT

wmsys.wm_concat(USER_NAME) AS USER_LIST

FROM T;

执行结果为:

USER_LIST

————————

Tom,Bob,John

综上所述,Oracle数据支持多种方式合并行数据,例如,利用Listagg聚合函数,XMLQuery操作和递归查询等,可以根据业务需求和服务器性能,灵活使用这几种方式,实现行转列的必要性。


数据运维技术 » 合享奇迹:Oracle行数据合并的秘诀(oracle行数据合并)