Oracle: объединение нескольких результатов в подзапросе в одно значение, разделенное запятыми

Я пытаюсь преобразовать подзапрос с одной колонкой в ​​список значений, разделенных командами VARCHAR.

Это идентично этому вопросу, но для Oracle, а не для SQL Server или MySQL.


person Jason Cohen    schedule 29.01.2009    source источник
comment
stackoverflow.com/questions/1120706/   -  person derobert    schedule 04.02.2011


Ответы (5)


На сайте Тима Холла есть отличный обзор доступных методов агрегирования строк .

person Justin Cave    schedule 29.01.2009

Я обнаружил, что это работает. Мысли?

SELECT SUBSTR (c, 2) concatenated
  FROM (SELECT     SYS_CONNECT_BY_PATH ( myfield, ',') c, r
              FROM (SELECT   ROWNUM ID, myfield,
                             RANK () OVER (ORDER BY ROWID DESC) r
                        FROM mytable
                    ORDER BY myfield)
        START WITH ID = 1
        CONNECT BY PRIOR ID = ID - 1)
 WHERE r = 1;
person Jason Cohen    schedule 29.01.2009
comment
Разве это не ломается, если значения вашего идентификатора не непрерывны? - person Bill Karwin; 29.01.2009
comment
хммм, да, думаю, ты прав. :-( - person Jason Cohen; 29.01.2009
comment
Я не уверен, почему у вас во внутреннем запросе есть ROWNUM и RANK (). Вам, вероятно, понадобится только RANK (), а затем НАЧАТЬ С r = 1 CONNECT BY PRIOR r = r - 1. Это не требует непрерывных идентификаторов, поскольку генерируются как идентификатор, так и ранг. - person Justin Cave; 29.01.2009
comment
Однако вы, вероятно, захотите использовать ROW_NUMBER (), а не RANK () в целом. В этом случае это не имеет значения, потому что ROWID уникален, но если вы заказываете столбец, который потенциально может быть неуникальным, вам не нужно несколько строк с одинаковым рангом. - person Justin Cave; 29.01.2009

11.2 представил LISTAGG, который в отличие от WM_CONCAT задокументирован. У нас еще нет версии 11.2, поэтому мы используем настраиваемую агрегатную функцию.

person Leigh Riffel    schedule 03.02.2010
comment
Это определенно лучший ответ, который я когда-либо видел, и это именно то, что я искал! Спасибо. - person Harmon; 10.01.2013

Вот блог, в котором показано, что запрос Oracle работает как MySQL GROUP_CONCAT():

http://halisway.blogspot.com/2006/08/oracle-groupconcat-updated-again.html

person Bill Karwin    schedule 29.01.2009

ВЫБЕРИТЕ deptno, wm_concat (ename) КАК сотрудники ИЗ emp GROUP BY deptno;

Ссылка: http://forums.oracle.com/forums/thread.jspa?messageID=1186901�

person bluwater2001    schedule 25.08.2010