为了账号安全,请及时绑定邮箱和手机立即绑定

在不创建存储过程的情况下,如何在Oracle中将多行串联在一起?

/ 猿问

在不创建存储过程的情况下,如何在Oracle中将多行串联在一起?

波斯汪 2019-11-30 13:36:38

如何在不创建存储过程的情况下在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


查看完整描述

3 回答

?
慕村225694

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


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


SELECT questionid,

       LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,','))

       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements

FROM   (SELECT questionid,

               elementid,

               ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr,

               ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) -1 AS prev

        FROM   emp)

GROUP BY questionid

CONNECT BY prev = PRIOR curr AND questionid = PRIOR questionid

START WITH curr = 1;


查看完整回答
反对 回复 2019-11-30
?
繁花不似锦

在Oracle 11gR2中,LISTAGG子句可以解决问题:


SELECT question_id,

       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)

FROM YOUR_TABLE

GROUP BY question_id;

当心结果字符串是否太大(例如,对于VARCHAR2,超过4000个字符):从版本12cR2开始,我们可以使用ON OVERFLOW TRUNCATE / ERROR来处理此问题。


查看完整回答
反对 回复 2019-11-30
?
慕斯709654

简单:


SELECT question_id, wm_concat(element_id) as elements

FROM   questions

GROUP BY question_id;

经过10g的个人测试;-)


从http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php


查看完整回答
反对 回复 2019-11-30

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信