ORACLE 删除重复数据(保留第一条记录)
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');