没有 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
我不想使用任何 XMLPATH
或 coalesce
函数。
只需简单的 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,您有以下字符串聚合技术:
- ROW_NUMBER() 和 SYS_CONNECT_BY_PATH
- 用户定义的函数 STRAGG 由 Tom Kyte 在此处演示 https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
- 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>
我有 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
我不想使用任何 XMLPATH
或 coalesce
函数。
只需简单的 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,您有以下字符串聚合技术:
- ROW_NUMBER() 和 SYS_CONNECT_BY_PATH
- 用户定义的函数 STRAGG 由 Tom Kyte 在此处演示 https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
- 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>