LeetCode-SQL篇 196-delete select使用

本文探讨了在LeetCode中如何高效地使用SQL删除重复记录。通过分析指出,直接使用`delete`和子查询可能导致问题,建议创建临时表进行操作。提供了两种解决方案,包括利用`group by`和`min`的优化方法,以及官方给出的笛卡尔积解决方案,但警告后者可能存在风险。
摘要由CSDN通过智能技术生成

简单分析

  • 一说起删除重复记录,可以想到用delete + select + groupby组合
  • 保留唯一重复记录,需要结合实际场景保留符合要求的数据
  • 注意点:delete 不能直接delete from table where id in(select * from tab1),不能直接把select得到的结果作为delete的条件,所以需要建立临时表来操作;

解决方案 

方案一:

        用select筛选出需要删除的ids、或筛选出不需要删除的ids,两种都可,只不过一种是选中,一种是反选;话不多少,直接贴我第一版sql:

DELETE from person_email WHERE id  NOT in (
    SELECT temp.id FROM (
        SELECT min(id) as id from person_email GROUP BY email HAVING count(1) > 1
        UNION ALL
        SELECT id as id from person_email GROUP BY email HAVING count(1) = 1
    ) temp
);

【注:1.通过group by email,筛选出出现一次,以及重复出现的最小的id;2.把select筛选出的结果放入临时表;3.通过反选的方式,把不在这个id范围的重复数据都删掉,保留的都是符合条件的数据了】

【优化】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值