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 的 10gR211gR1 版本,您可以使用 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中具有行的聚合

Oracle Database 19c 中的 LISTAGG DISTINCT

LISTAGG 相当于 10 克 [重复]

oracle WMSYS.WM_CONCAT 函数转为listagg