Oracle 11gR2 中引入了 LISTAGG 函数,以简化字符串聚合。在Oracle 12cR2中,它已扩展为包括溢出错误处理。Oracle 19c 中通过包含 DISTINCT 关键字,可以从 LISTAGG 结果中删除重复项。

1、初始化环境-- DROP TABLE EMP PURGE;

CREATE TABLE EMP (

EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

MGR NUMBER(4),

HIREDATE DATE,

SAL NUMBER(7,2),

COMM NUMBER(7,2),

DEPTNO NUMBER(2)

);

INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);

INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);

INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);

INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);

INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);

INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);

INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);

INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);

INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);

INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);

INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);

INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);

INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);

INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

COMMIT;

2、问题

LISTAGG 函数的默认使用如下所示。COLUMN employees FORMAT A40

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees

FROM emp

GROUP BY deptno

ORDER BY deptno;

DEPTNO EMPLOYEES

---------- ----------------------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

SQL>

让我们在部门10中添加一些额外的,名称为“ MILLER”的人,在汇总列表中提供重复项。

INSERT INTO emp VALUES (9998,'MILLER','ANALYST',7782,to_date('23-1-1982','dd-mm-yyyy'),1600,NULL,10);

INSERT INTO emp VALUES (9999,'MILLER','MANADER',7782,to_date('23-1-1982','dd-mm-yyyy'),1500,NULL,10);

COMMIT;

正如预期的那样,我们现在在部门10中看到多个名称为“ MILLER”的条目。COLUMN employees FORMAT A40

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees

FROM emp

GROUP BY deptno

ORDER BY deptno;

DEPTNO EMPLOYEES

---------- ----------------------------------------

10 CLARK,KING,MILLER,MILLER,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

SQL>

如果那是我们的期望,那就太好了。如果我们要删除重复项,我们该怎么办?

3、19c 之前的解决方案

我们可以通过多种方式解决此问题。在以下示例中,我们使用 ROW_NUMBER 分析函数删除所有重复项,然后使用常规的 LISTAGG 函数聚合数据。

COLUMN employees FORMAT A40

SELECT e2.deptno, LISTAGG(e2.ename, ',') WITHIN GROUP (ORDER BY e2.ename) AS employees

FROM (SELECT e.*,

ROW_NUMBER() OVER (PARTITION BY e.deptno, e.ename ORDER BY e.empno) AS myrank

FROM emp e) e2

WHERE e2.myrank = 1

GROUP BY e2.deptno

ORDER BY e2.deptno;

DEPTNO EMPLOYEES

---------- ----------------------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

SQL>

或者,我们可以在内联视图中使用 DISTINCT 删除重复的行,然后使用常规的 LISTAGG 函数调用来聚合数据。

COLUMN employees FORMAT A40

SELECT e2.deptno, LISTAGG(e2.ename, ',') WITHIN GROUP (ORDER BY e2.ename) AS employees

FROM (SELECT DISTINCT e.deptno, e.ename

FROM emp e) e2

GROUP BY e2.deptno

ORDER BY e2.deptno;

DEPTNO EMPLOYEES

---------- ----------------------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

SQL>

4、从19c开始的解决方案

Oracle 19c 引入了一个更简单的解决方案。现在,我们可以直接在 LISTAGG 函数调用中包含 DISTINCT 关键字。COLUMN employees FORMAT A40

SELECT deptno, LISTAGG(DISTINCT ename, ',') WITHIN GROUP (ORDER BY ename) AS employees

FROM emp

GROUP BY deptno

ORDER BY deptno;

DEPTNO EMPLOYEES

---------- ----------------------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

SQL>

默认功能是包括所有结果,我们可以使用 ALL 关键字明确表示这些结果。SELECT deptno, LISTAGG(ALL ename, ',') WITHIN GROUP (ORDER BY ename) AS employees

FROM emp

GROUP BY deptno

ORDER BY deptno;

DEPTNO EMPLOYEES

---------- ----------------------------------------

10 CLARK,KING,MILLER,MILLER,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

SQL>

oracle数据库listagg,Oracle 19c 中的 LISTAGG 函数结果去重相关推荐

  1. oracle set feedback off,Oracle数据库之Oracle导出数据中的prompt,set feedback 等是什么意思...

    本文主要向大家介绍了Oracle数据库之Oracle导出数据中的prompt,set feedback 等是什么意思,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. mpt 输出 ...

  2. oracle中如何加字母,Oracle数据库之oracle数据库表插入数据的时候如何产生一个字母+数字...

    本文主要向大家介绍了Oracle数据库之oracle数据库表插入数据的时候如何产生一个字母+数字,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle 语句中" ...

  3. oracle中毒,oracle数据库中毒恢复 oracle数据库解密恢复 服务器中勒索病毒解密恢复.Hermes666...

    oracle数据库中毒恢复 oracle数据库解密恢复 服务器中勒索病毒解密恢复.Hermes666 客户名称 保密 数据类型 oracle 11G 数据容量 100 gb 故障类型 服务器中毒,文件 ...

  4. 用ado把excel数据写入oracle,如何将excel表格数据导入到oracle数据库对应的表中?!oracle导出excel文件...

    如何把excel里的表导入到oracle里 使用第三方工具吧,toad之类的 一个excel表格中有多个sheet,如何将其导入oracle数据库 户和要用DBA 最简单得建用户: create us ...

  5. oracle数据库表excel文件位置,“如何将excel表格数据导入到oracle数据库对应的表中?“数据库文件导入excel表格数据库中...

    如何实现Excel表格自动导入到数据库 库?是什么数据库?sql?access?mysql?我以sql2008为例子 1.打开SQL Server Management Studio-任务-数据 2. ...

  6. oracle表中放入word,“如何将excel表格数据导入到oracle数据库对应的表中?“将excel表格导入word...

    如何将excel表格数据导入到oracle数据库对应的表中? 敢问楼主,表A几列,表B存在几列,表C存在几列 常规方法(表中列和excel中列) PLSQL 中 : select * from A u ...

  7. oracle排序null排最后,Oracle数据库之Oracle 排序中使用nulls first 或者nulls last 语法...

    本文主要向大家介绍了Oracle数据库之Oracle 排序中使用nulls first 或者nulls last 语法,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. -原理 N ...

  8. column ambiguously defined oracle数据库分页语句查询中select嵌套时出错

    column ambiguously defined &oracle数据库分页语句查询中select嵌套时出错 转载于 [ lev草梦的博客](http://blog.sina.com.cn/ ...

  9. oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...

    本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...

  10. oracle数据库gold,Oracle数据库之Oracle GoldenGate 12.2.0.1 安装、升级和删除

    本文主要向大家介绍了Oracle数据库之Oracle GoldenGate 12.2.0.1 安装.升级和删除,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 1.准备工作 选择 ...

最新文章

  1. 思科3750开启策略路由功能
  2. 超燃!Apache Flink 全球顶级盛会强势来袭
  3. “未能为域创建GPO 出现扩展错误”的解决办法
  4. Hadoop MapReduce的一些相关代码Code
  5. PLSQL写给员工涨工资,总裁涨1000,经理涨800,其他员工涨400
  6. [BUUCTF-pwn]——jarvisoj_tell_me_something
  7. 编写python程序、创建名为class的数据库_Python中的元类(metaclass)以及元类实现单例模式...
  8. 50-overlay 如何实现跨主机通信?
  9. SkyWalking Liunx 环境搭建NetCore接入
  10. java 锁_Java之线程并发的各种锁、锁、锁
  11. 硬件创业者们,如何避免掉到供应链的大坑里爬不出来
  12. m_map投影_MATLAB——m_map指南(1)
  13. 深圳地图echarts
  14. 哪位大神了解LEACH算法的可以解释下,LEACH算法构成网络结构时是用在随机部署网络节点的还是确定性部署网络节点呢?
  15. IEC104 规约详细解读(一) 协议结构
  16. linux/unix系统下IOZONE/iozone磁盘性能测试工具方法
  17. 【深度学习】视频分类技术整理
  18. 景深与焦距、物距、像元、光圈之间的关系
  19. 树莓派上3g模块的使用
  20. Eclipse中的Lua插件 LDT

热门文章

  1. 【02 英语语法:复句的语法】
  2. java setvisible怎么用_java – 在已经可见的帧上调用setVisible(true)
  3. linux 快速删除大量小文件(数十万级别)
  4. 负载测试和压力测试的区别
  5. springboot+jpa配置多数据源(Oracle+SqlServer)
  6. QQ天气H5-前端完整解析
  7. axel多线程下载ftp文件(需登录)Ubuntu
  8. 字符常见的编码方式详解
  9. CAD制图教程:CAD软件中怎么定义层高?
  10. 【经验】开机需要登录(微软)microsoft账户进不了桌面?4招解决!