Вопрос по sql – Как можно объединить несколько строк в одну в Oracle без создания хранимой процедуры? [Дубликат]

52

This question already has an answer here:

SQL Query to concatenate column values from multiple rows in Oracle 11 answers

Как я могу достичь следующего в оракуле без создания хранимой процедуры?

Набор данных:

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   ответа
35

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

Pesonally проверен на 10g ;-)

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Dan Polites
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
ORA-06502: PL/SQL: numeric or value error: character string buffer too smallError: User Rate Limit Exceeded
2

включая сравнение производительности:http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

91

LISTAGG пункт должен сделать свое дело:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededGROUP BY question_id ?
Error: User Rate Limit Exceededv$versionError: User Rate Limit Exceededproduct_component_versionError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
27

но самый простой - это пользовательская функция.Попробуйте это для способа, который не требует функции.  Как примечание, нет простого способа без функции.

Это самый короткий маршрут без пользовательской функции: (он использует функции 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;
Error: User Rate Limit Exceeded Dan Polites
Error: User Rate Limit ExceededORA-30004: when using SYS_CONNECT_BY_PATH function, cannot have separator as part of column value.Error: User Rate Limit ExceededORA-01489: result of string concatenation is too long.

Похожие вопросы