合享奇迹: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操作和递归查询等,可以根据业务需求和服务器性能,灵活使用这几种方式,实现行转列的必要性。