当前位置:首页 > 技能相关 > ORACLE > 正文内容

ORACLE 删除重复数据(保留第一条记录)

admin9个月前 (08-12)ORACLE21540 修订时间:2024-08-12 18:21:52

ORACLE 删除重复数据

Oracle使用中,对于数据的统计,有时候会有一些特殊的需求,比如单据存在多次的,仅取第一条记录,那么下面的语句总有一条能满足您的需求。依据单个、多个字段判断重复。

1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断

select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1)

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

DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) > 1);

3、查找表中多余的重复记录(多个字段)

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

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

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

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

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

拓展

以下语句是用来删除移动护理VTE评估报表记录,根据患者的患者ID、住院次数约束唯一性,进行数据的匹配删除,写存储过程,创建定时任务去筛选,请看下列语句:

delete from ydhl.vte_patient_list a
 where (a.PATIENT_ID, a.VISIT_ID) in
       (select PATIENT_ID, VISIT_ID
          from ydhl.vte_patient_list
         group by PATIENT_ID, VISIT_ID
        having count(*) > 1)
   and rowid not in (select min(rowid)
                       from ydhl.vte_patient_list
                      group by PATIENT_ID, VISIT_ID
                     having count(*) > 1)
   and VTE_EVALUATION_CREATETIME >=
       to_date('2024-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');

语句解释:

患者ID和住院次数记录大于1次的记录

(a.PATIENT_ID, a.VISIT_ID) in (select PATIENT_ID, VISIT_ID from ydhl.vte_patient_list group by PATIENT_ID, VISIT_ID having count(*) > 1)

取rowid最小的记录,与上述条件组合,不是最小记录的记录

rowid not in (select min(rowid) from ydhl.vte_patient_list group by PATIENT_ID, VISIT_ID having count(*) > 1)

当然上述的min(rowid)可以换成max(rowid),取最大记录保留;

约束数据时间,避免前期批量导入过多数据而引起数据库锁表;

VTE_EVALUATION_CREATETIME >= to_date('2024-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');
 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/?id=408

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。