Sql 在Oracle中,如何将多行连接成一行而不创建存储过程?

Sql 在Oracle中,如何将多行连接成一行而不创建存储过程?,sql,oracle,concatenation,string-aggregation,Sql,Oracle,Concatenation,String Aggregation,如何在oracle中实现以下功能而不创建存储过程 数据集: question_id element_id 1 7 1 8 2 9 3 10 3 11 3 12 预期结果: question_id element_id 1 7,8 2 9 3 10,11

如何在oracle中实现以下功能而不创建存储过程

数据集:

question_id    element_id
1              7
1              8
2              9
3              10
3              11
3              12
预期结果:

question_id    element_id
1              7,8
2              9
3              10,11,12

有很多方法可以进行字符串聚合,但最简单的是用户定义的函数。需要注意的是,没有函数就没有简单的方法

这是没有自定义函数的最短路径:(它使用ROW_NUMBER()和SYS_CONNECT_BY_PATH函数)

简单:

在10g上单独测试;-)


中,此OTN线程包含几种进行字符串聚合的方法,包括性能比较:

从Oracle 11gR2中,该子句应该实现以下功能:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;

如果生成的字符串太大(例如,VARCHAR2超过4000个字符):从版本12cR2开始,我们可以使用来处理此问题。

注意,wm_concat是一个未记录的函数。所以在生产代码中使用它之前,您可能需要三思而后行。非常酷。对我也有用,但我需要确保此函数在我们的生产环境中可用。我得到错误-->ORA-00904 WM_CONCAT:无效标识符
ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小
如果连接的值恰好超过4000字节的最大长度。我以前使用wmsys.WM_CONCAT(…)对于我在Oracle11g(OracleDatabase11gEnterpriseEdition 11.1.0.7.0-64位生产版)中的大多数快速而肮脏的工作来说,效果非常好!行号()是使sys\u connect\u by\u path对我起作用所缺少的。请注意,当应用此技术连接值可能包含分隔符的字段时,会引发以下错误:
ORA-30004:使用sys\u connect\u by\u path函数时,不能将分隔符作为列值的一部分。
。。。如果连接的值恰好超过了4000字节的最大长度,则会出现错误:
ORA-01489:字符串连接的结果太长。
作为旁注,我们可以通过查询表
v$version
product\u component\u version
来了解数据库版本。11.2表示11gR2。无论如何,它帮助了我很长一段时间使用它,这很简单。这是否缺少
问题分组\u id
SELECT question_id, wm_concat(element_id) as elements
FROM   questions
GROUP BY question_id;
SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;