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

如何在不创build存储过程的情况下在oracle中实现以下function?

数据集:

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 

4 Solutions collect form web for “如何在Oracle中将多行连接成一个而不创build存储过程?”

string聚合有许多方法,但最简单的是用户定义的函数。 试试这个不需要函数的方法。 作为一个说明,没有这个function没有简单的方法。

这是没有自定义函数的最短路由:(它使用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; 

从Oracle 11gR2开始, LISTAGG子句应该做到这一点:

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

简单:

 SELECT question_id, wm_concat(element_id) as elements FROM questions GROUP BY question_id; 

对10g进行的Pesonallytesting;-)

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

这个OTN线程包含几种方法来进行string聚合,包括性能比较: http : //forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

  • 在JavaScript中创build多行string
  • 将bool转换为C ++中的文本
  • PHP删除特定string之前的所有字符
  • 在JavaScript中,indexOf()和search()有什么区别?
  • Java中用于文本string的64位散列函数是什么?
  • C#中的多行string
  • 如何从string中删除前10个字符?
  • Groovy多行string有什么问题?
  • 如何在Scala中使用java.String.format?
  • 为什么我不能用一个反斜杠结束一个原始string?
  • 如果string在.NET中是不可变的,那么为什么子string需要O(n)次?