Oracle 删除重复数据只留一条

该博客介绍了如何使用SQL查询删除数据库中重复的数据,通过在ehr.PH_MENU_ORG表中定位PRO_TYPE为5且ORG_ID为特定值的记录,然后利用子查询找出重复项并删除,最终成功移除了四条重复记录。

场景:

删除这三列重复的数据只保留一份
在这里插入图片描述

实现:

delete from ehr.PH_MENU_ORG a
 where (a.ORG_ID,a.MENU_ID,a.PRO_TYPE) in
       (select ORG_ID,MENU_ID,PRO_TYPE
          from ehr.PH_MENU_ORG
         where PRO_TYPE = 5
           and org_Id = '243057cf-10fe-434d-a0bb-0c031131e885'
         group by ORG_ID,MENU_ID,PRO_TYPE
        having count(*) > 1)
   and rowid not in (select min(rowid)
                       from ehr.PH_MENU_ORG
                      where PRO_TYPE = 5
                        and org_Id = '243057cf-10fe-434d-a0bb-0c031131e885'
                      group by ORG_ID,MENU_ID,PRO_TYPE
                     having count(*) > 1)

执行结果:

重复的四条数据已经成功删除
在这里插入图片描述

总结

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)
### Oracle 删除重复数据保留一条的SQL方法 在Oracle数据库中,可以通过`ROWID`来唯一标识每一行数据,并利用分组查询和子查询的方式删除复记录。以下是几种常见的解决方案: #### 方法一:基于 `ROWID` 和 `GROUP BY` 此方法适用于判断复的标准为多个字段的情况。 ```sql DELETE FROM your_table WHERE ROWID NOT IN ( SELECT MIN(ROWID) FROM your_table GROUP BY column1, column2, ..., columnN ); ``` 这种方法通过 `MIN(ROWID)` 获取每组中的最小 `ROWID` 值,从而保留该行并删除其他复行[^1]。 --- #### 方法二:基于窗口函数 `ROW_NUMBER()` 如果需要按照某个特定顺序(如时间戳或日期字段)保留最新的记录,可以使用窗口函数 `ROW_NUMBER()`。 ```sql DELETE FROM your_table WHERE id IN ( SELECT id FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY column1, column2, ..., columnN ORDER BY date_column DESC) AS rn FROM your_table t ) WHERE rn != 1 ); ``` 在此方案中,`ROW_NUMBER()` 函数会对指定列组合进行分区,并按给定的排序规则分配序号。最终删除所有序号不等于1的行[^3]。 --- #### 方法三:针对单个字段作为复标准 当只需要依据单一字段判断是否复时,可采用如下方式: ```sql DELETE FROM your_table a WHERE EXISTS ( SELECT 1 FROM your_table b WHERE a.column_name = b.column_name AND a.ROWID > b.ROWID ); ``` 这里通过比较两行之间的 `ROWID` 大小,确保每次只保留具有较小 `ROWID` 的那条记录[^5]。 --- #### 注意事项 - 如果尝试直接操作带有大量数据的大表,建议先创建临时表存储中间结果再执行删除动作,以免影响性能。 - 使用上述语句之前最好备份原始表格以防误删要资料。 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值