Oracle数据库使用 listagg去重删除重复数据的方法汇总

2025-01-21 04:50

本文主要是介绍Oracle数据库使用 listagg去重删除重复数据的方法汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO...

listagg聚合之后很多重复数据,下面是解决重复数据问题

Oracle数据库使用 listagg去重删除重复数据的方法汇总

案例表

create table "dept_tag_info"
(
"tag_id" bigint not null,
"tag_code" varchar(200),
"tag_name" varchar(500),
"tag_level" varchar(200),
"parent_id" bigint,
"gmt_create" datetime(6),
"create_by" varchar(50),
"update_by" varchar(50),
"gmt_modified" datetime(6),
"del_flag" char(1),
"sort" integer,
"multiple_choice" char(1),
"relation_dept_cahttp://www.chinasem.cntegory" varchar(500),
"tips_text" varchar(2000),
"remarks" varchar(500),
"enabled" char(1),
constraint "dept_tag_info_new_pk" not cluster primary key("tag_id")) storage(on "ctbiyi_data_v3", clusterbtr) ;
comment on table "dept_tag_info" is '企业标签基础信息表';
comment on column "dept_tag_info"."tag_id" is '主键';
comment on column "dept_tag_info"."tag_code" is '标签编码';
comment on column "dept_tag_info"."tag_name" is '标签名称';
comment on column "dept_tag_info"."tag_level" is '标签层级';
comment on column "dept_tag_info"."parent_id" is '父节点编码id';
comment on column "dept_tag_info"."gmt_create" is '创建时间';
comment on column "dept_tag_info"."create_by" is '创建人';
comment on column "dept_tag_info"."update_by" is '修改人';
comment on column "dept_tag_info"."gmt_modified" is '修改时间';
comment on column "dept_tag_info"."del_flag" is '删除标记 0-未删除 1-已删除';
comment on column "dept_tag_info"."sort" is '排序';
comment on column "dept_tag_info"."multiple_choice" is '多选(1是 0否)';
comment on column "dept_tag_info"."relation_dept_category" is '关联主体';

为了方便大家看所以所有小写

    select 
    t.tag_code,
    t.tag_name,
    listagg(t.tag_level, ',') within group(order by t.tag_level) as tag_levels
from 
    dept_tag_info t
group by 
    t.tag_code, 
    t.tag_name;

第一种:使用wm_concat() + distinct去重聚合

select 
    t.tag_code,
    t.tag_name,
    wm_concat(distinct t.tag_level) as tag_levels
from 
    dept_tag_info t
group by 
    t.tag_code, 
    t.tag_name;

第二种:使用listagg,先去重,再聚合

select 
    t.tag_code,
    t.tag_name,
    listagg(t.tag_level, ',') within group(order by t.tag_level) as tag_levels
from 
    (select distinct s.tag_code, s.tag_name, s.tag_level
     from dept_tag_info s) t
group by 
    t.tag_code, 
    t.tag_name;

第三种:xmlagg(xmlparse(content t.tag_level || ‘,’ wellformed) order by t.tag_level):

使用 xmlagg 和 xmlparse 函数将 tag_level 字段聚合为一个用逗号分隔的字符串,并按 tag_level 排序。
getclobval():将 xml 类型的结果转换为 clob(character large objphpect)。
rtrim(…, ‘,’):去掉聚合结果末尾的逗号。
内部子查询 select distinct s.tag_code, s.tag_name, s.tag_level from dynamic_ctbiyi_v3.dept_tag_info s:
选择唯一的 tag_code、tag_name 和 tag_level

select 
    t.tag_code,
    t.tag_name,
    rtrim(
        xmlagg(
            xmlparse(content t.tag_level || ',' wellformed)
            order by t.tag_level
        ).getclobval(), 
        ','
    ) as tag_levels
from 
    (select distinct s.tag_code, s.tag_name, s.tag_level
     from dept_tag_info s) t
group by 
    t.tag_code, 
    t.tag_name;

listagg 的优缺点

优点:
简洁和易用:LISTAGG 语法简单,易于理解和使用。
性能较好:在许多情况下,LISTAGG 的执行速度会快于 XMLAGG,尤其是在处理较少数据量时。
排序:支持在聚合过程中对字符串进行排序,使用 WITHIN GROUP 子句。
缺点:
字符串长度限制:LISTAGG 生成的字符串长度不能超过 4000 字符,如果超过这个限制,会抛出错误。
无格式化功能:LISTAGG 仅限于字符串连接,不支持更复杂的格式化。
xmlagg 的优缺点
优点:
字符串长度更大:XMLAGG 可以处理比 LISTAGG 更大的字符串,因为生成的结果是 CLOB 类型,不受China编程 4000 字符的限制。
灵活性:支持更复杂的 XML 处理和格式化功能,适合需要复杂字符串操作的场景。
缺点:
性能问题:在处理大量数据时,XMLAGG 可能比 LIST编程AGG 慢,因为涉及到 XML 解析和处理。
复杂性:语法相对复杂,使用起来不如 LISTAGG 简单。
使用 LISTAGG:当聚合后的字符串长度不超过 4000 字符时,并且只需要简单的字符串连接和排序。
使用 XMLAGG:当聚合后的字符串长度可能超过 4000 字符,或者需要更复杂的格式化和处理时。
根据具体需求选择合适的函数可以在保证代码简洁性和执行效率的同时,满足业务需求。

手动处理重复数据的一种快捷安全的方式

-- 查找重复记录
select "tag_id", count(*) as cnt
from dept_tag_info
group by "tag_id"
having count(*) > 1
order by cnt desc;

主删除语句:

delete from dept_tag_info t
where t.rowid in (
    select rid
    from (
        select t1.rowid as rid, row_number() over (partition by t1.tag_code, t1.tag_name order by 1) as rn
        from dept_tag_info t1
    ) t2
    where t2.rn > 1
);

如何在oracle SQL中使用XMLAGG和LISTAGG函数进行字符串聚合。
产品工厂聚合
场景:你有一个名为product_details的表,里面有一个列product_factory,你希望将所有不同的产品工厂聚合成一个以逗号分隔的列表。

SELECT   
    RTRIM(XMLAGG(XMLPARSE(content = dd.product_factory || ',' wellformed)   
    ORDER BY dd.product_factory).getclobval(), ',') AS productFactory  
FROM   
    product_details dd;

Oracle数据库使用 listagg去重删除重复数据的方法汇总

产品名称聚合
场景:你有另一个表product_changes,你想要聚合在特定日期后发生变化的产品名称。

SELECT   
    LISTAGG(dd.change_after_part_name, ',') WITHIN GROUP (ORDER BY dd.change_after_part_name) AS productName  
FROM   
    product_changes dd  
WHERE   
    dd.change_date > '2023-01-01';

Oracle数据库使用 listagg去重删除重复数据的方法汇总

同时使用两者的聚合
场景:你希望在一个查询中获取产品工厂和其相关产品名称的列表。

SELECT   
    RTRIM(XMLAGG(XMLPARSE(content = dd.product_factory || ',' wellformed)  
    ORDER BY dd.product_factory).getclobval(), ',') AS productFactory,  
    LISTAGG(cc.change_after_part_name, ',') WITHIN GROUP (ORDER BY cc.change_after_part_name) AS productName  
FROM   
    product_details dd  
LEFT JOIN   
    product_changes cc ON 编程dd.product_id = cc.product_id  
WHERE   
    cc.change_date > '2023-01-01';

Oracle数据库使用 listagg去重删除重复数据的方法汇总

到此这篇关于Oracle 系列数据库使用 listagg去重,删除重复数据的几种方法的文章就介绍到这了,更多相关Oracle listagg去重内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Oracle数据库使用 listagg去重删除重复数据的方法汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153157

相关文章

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

Maven中的profiles使用及说明

《Maven中的profiles使用及说明》:本文主要介绍Maven中的profiles使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录主要用途定义 Profiles示例:多环境配置激活 Profiles示例:资源过滤示例:依赖管理总结Maven 中的