2

我有如下表

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

我不想使用任何XMLPATHcoalesce功能。只是在简单的 SQL 查询中,我需要得到预期的结果。

4

2 回答 2

2

由于您在Oracle 10g版本上,因此无法使用LISTAGG. 它是在11g.

不要使用WM_CONCAT,因为它是一个未记录的功能,并且已从最新版本中删除。请参阅为什么 wm_concat 在这里不起作用?

对于 10g,您有以下字符串聚合技术:

  1. ROW_NUMBER()SYS_CONNECT_BY_PATH
  2. 用户定义的函数STRAGG由 Tom Kyte 演示https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
  3. PL/SQL中的COLLECT函数

以下是使用自 9i 以来可用的函数ROW_NUMBER()的纯 SQL 方法:SYS_CONNECT_BY_PATH

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>
于 2015-04-29T08:31:01.283 回答
1

在 Oracle 10 中,您可以为此使用非官方函数 WM_CONCAT。在以后的版本中,您将使用 LISTAGG。

select id, wm_concat(name)
from mytable
group by id;
于 2015-04-29T07:48:40.453 回答