Oracle数据库重复数据判断以及过滤重复记录(只保留一条数据)

项目背景
最近做项目,发现oracle中存在重复数据,导致项目查询结果冗余,特此需要对数据进行去重。比如下面截图所示:
在这里插入图片描述
场景一:根据单个字段(Id)来判断重复记录
1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断

select * fromwhere Id in (select Id fromgroup by Id having count(Id) > 1);

2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录

DELETE fromWHERE (id) IN (
 SELECT id FROMGROUP BY id HAVING COUNT(id) > 1)
 AND ROWID NOT IN (
 SELECT MIN(ROWID) FROMGROUP BY id HAVING COUNT(*) > 1);

场景二:根据多个字段来判断重复记录
1、查找表中多余的重复记录(多个字段)

select * from 表 a where (a.Id,a.seq) 
in(select Id,seq fromgroup by Id,seq having count(*) > 1);

2、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from 表 a where (a.Id,a.seq) 
in (select Id,seq fromgroup by Id,seq having count(*) > 1) 
and rowid not in (select min(rowid) 
fromgroup by Id,seq having count(*)>1);

执行结果
在这里插入图片描述
场景三:多表关联查询,过滤重复数据记录,相同记录只查询一条
原始记录如下图所示:
在这里插入图片描述
核心SQL语句如下:

SELECT
    * 
FROM
    ( SELECT row_number () over ( partition BY 分组的字段名 ORDER BY 排序字段名 DESC ) rn, 字段名 FROM 表名 ) 
WHERE
    rn = 1

则经过过滤去重,查询出结果为:
在这里插入图片描述

在Oracle数据库中拉数据时,需要过滤替换掉空值null。原始表数据如下:
在这里插入图片描述
需要将material列中的null值和materialNo中的null值合并成不包含null的新列,
借助NVL()函数,实现从两个表达式返回一个非 null 值

--如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。
--如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。
--eExpression1 和 eExpression2 可以是任意一种数据类型。
--如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 NULL。
NVL(eExpression1, eExpression2)

利用NVL函数执行之后的结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值