没有 XML 路径的逗号分隔列

Comma separated column without XML path

我有 table 如下所示

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 查询,我就需要获得预期的结果。

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

select id, wm_concat(name)
from mytable
group by id;

由于您使用的是Oracle 10g版本,您无法使用LISTAGG。它是在 11g 中引入的。

不要使用WM_CONCAT,因为它是未记录的功能,并已从最新版本中删除。参见 Why does the wm_concat not work here?

对于 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. COLLECT 函数在 PL/SQL

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

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>