oracle sql listagg [重复]
Posted
技术标签:
【中文标题】oracle sql listagg [重复]【英文标题】:oracle sql listagg [duplicate] 【发布时间】:2018-11-30 12:54:35 【问题描述】:SELECT deptno,
LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
错误:- ORA-00923: FROM 关键字未在预期位置找到 00923. 00000 - “在预期的地方找不到 FROM 关键字” *原因: *操作:行错误:1 列:42
Oracle 数据库 11g 企业版版本 11.1.0.7.0 - 64 位生产
【问题讨论】:
LISTAGG()
是在第 2 版中引入的,因此出现了错误。 Check out the alternatives
【参考方案1】:
对于 Oracle 的 10gR2
或 11gR1
版本,您可以使用 sys_connect_by_path
贡献的分层查询:
with emp( ename, deptno ) as
(
select 'CLARK',10 from dual union all
select 'MILLER',10 from dual union all
select 'KING',10 from dual union all
select 'FORD',20 from dual union all
select 'SCOTT',20 from dual union all
select 'JONES',20 from dual union all
select 'SMITH',20 from dual union all
select 'ADAMS',20 from dual union all
select 'WARD',30 from dual union all
select 'MARTIN',30 from dual union all
select 'TURNER',30 from dual union all
select 'JAMES',30 from dual union all
select 'ALLEN',30 from dual union all
select 'BLAKE',30 from dual
)
select deptno, ltrim(sys_connect_by_path(ename, ','), ',') as enames
from (select deptno,
ename,
row_number() over(partition by deptno order by ename) as rn
from emp)
where connect_by_isleaf = 1
connect by deptno = prior deptno
and rn = prior rn + 1
start with rn = 1;
DEPTNO ENAMES
------ ------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
【讨论】:
以上是关于oracle sql listagg [重复]的主要内容,如果未能解决你的问题,请参考以下文章
SQL 中的 STUFF 等效函数(MySQL 中的 GROUP_CONCAT / Oracle 中的 LISTAGG)
从 CLOB ListAgg 值中删除 Oracle SQL 中的 HTML 代码
sql 从字符串..with毫秒的Oracle日期时间戳格式化。该示例还使用listagg在oracle中具有行的聚合