leet code sql 196
196. Delete Duplicate Emails
문제
- 중복되는 이메일 삭제
- 이메일이 처음 만들어진 아이디는 남긴다.
문제 접근
- delete from을 이용하여 삭제 처리
- delete from where subquery 사용 시 하위 쿼리를 한번 더 사용해주어야 한다.
-
row_number를 활용하여 1번을 제외한 아이디를 모두 가져와 삭제
- 속도 측면에서는 하나의 테이블을 조회하면 삭제 처리가 가능하여 빠르다.
1 2 3 4 5 6 7 8 9 10 11
delete from Person where id in ( select id from ( select id, row_number() over(partition by email order by id) rn from Person ) x where rn <> 1 )
다른 사람들의 코드 리뷰
- product join을 활용한 삭제 처리
- join을 활용하여 현재 자신과 이메일이 같으며, id가 큰 row를 모두 삭제
- 직관적이나, 속도 측면에서 많이 느리다.
1
2
3
4
5
delete p1
from Person p1, Person p2
where 1=1
and p1.email = p2.email
and p1.id > p2.id
- 서브 쿼리를 group by와 not in을 통하여 진행
- 알기로는 in이 처리 시 속도가 조금더 빠른것으로 알고 있으나, group by를 통한 속도 향상 처리가 되어 해당 문제에서는 아래 쿼리가 조금 더 빠른것으로 판단
1
2
3
4
5
6
7
8
9
10
delete from Person
where id not in (
select id
from (
select
min(id) as id
from Person
group by email
) as x
)