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

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


波斯汪
浏览 908回答 3
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 elementsFROM   (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 questionidCONNECT BY prev = PRIOR curr AND questionid = PRIOR questionidSTART WITH curr = 1;

繁花不似锦

在Oracle 11gR2中,LISTAGG子句可以解决问题:SELECT question_id,       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)FROM YOUR_TABLEGROUP BY question_id;当心结果字符串是否太大(例如,对于VARCHAR2,超过4000个字符):从版本12cR2开始,我们可以使用ON OVERFLOW TRUNCATE / ERROR来处理此问题。
打开App,查看更多内容
随时随地看视频慕课网APP