Столбец, разделенный запятыми, без пути XML

У меня есть таблица, как показано ниже

ID Name
1  a
1  b
1  c
2  d
2  e
3  f

Я хотел бы получить результат как

ID Name
1  a,b,c
2  d,e
3  f

Я не хочу использовать функции XMLPATH или coalesce. Просто в простом SQL-запросе мне нужно получить ожидаемый результат.


person user1912935    schedule 29.04.2015    source источник


Ответы (2)


Поскольку вы используете версию Oracle 10g, вы не можете использовать LISTAGG. Он был представлен в 11g.

И, пожалуйста, НЕ используйте WM_CONCAT, так как это недокументированная функция, которая была удалена из последней версии. См. Почему здесь не работает wm_concat?

Для 10g у вас есть следующие методы агрегации строк:

  1. ROW_NUMBER() и SYS_CONNECT_BY_PATH
  2. Пользовательская функция STRAGG, продемонстрированная Томом Китом здесь https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
  3. Функция COLLECT в PL/SQL

Ниже приведен чистый метод SQL с использованием функций ROW_NUMBER() и SYS_CONNECT_BY_PATH, доступных начиная с версии 9i:

SQL> column emp_list format a50
SQL> SELECT deptno,
  2         LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
  3         KEEP (DENSE_RANK LAST ORDER BY cur),',') AS emp_list
  4  FROM   (SELECT deptno,
  5                 ename,
  6                 ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS cur,
  7                 ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
  8          FROM   emp)
  9  GROUP BY deptno
 10  CONNECT BY prev = PRIOR cur AND deptno = PRIOR deptno
 11  START WITH cur = 1;

    DEPTNO EMP_LIST
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

SQL>
person Lalit Kumar B    schedule 29.04.2015

В Oracle 10 для этого можно использовать неофициальную функцию WM_CONCAT. В более поздних версиях вы должны использовать LISTAGG.

select id, wm_concat(name)
from mytable
group by id;
person Thorsten Kettner    schedule 29.04.2015
comment
Не используйте WM_CONCAT, так как он недокументирован, и более того, он был удален из последней версии. См. stackoverflow.com/a/28758117/3989608. - person Lalit Kumar B; 29.04.2015
comment
@Lalit Kumar B: Проблема не в недокументированности, синтаксис прост: WM_CONCAT([DISTINCT] column_name). Проблема в том, как я уже упоминал, что это неофициально. Поэтому он может быть недоступен в определенной установке. Единственная известная мне альтернатива — написать пользовательскую функцию агрегации, но вы также можете использовать WM_CONCAT и писать собственный WM_CONCAT только тогда, когда вы попадаете в ситуацию, когда функция отсутствует. - person Thorsten Kettner; 29.04.2015
comment
@Lalit Kumar B: А, я только что прочитал твой ответ. Так что есть есть альтернативы :-) - person Thorsten Kettner; 29.04.2015
comment
Я бы разрешил разработчикам использовать его только в тестовой среде как разовое действие. Никогда в производстве. Вы знаете ответ службы поддержки Oracle Oh!, wm_concat... We don't support it - person Lalit Kumar B; 29.04.2015