[LeetCode]0196-delete-duplicate-emails

민지킴·2022년 10월 26일
0

LeetCode

목록 보기
3/4
post-thumbnail

Repo : https://github.com/courage331/LeetCode/tree/main/0196-delete-duplicate-emails

풀이 : mysql도 사용하지 않아서 문제를 해결하는데 너무 오래걸렸다.
중복되는 이메일은 삭제하는데, id값이 가장 작은 이메일만 남기는 문제였다.

delete문에서 서브쿼리를 사용할 경우
You can't specify target table 'xxx' for update in FROM clause
라는 에러가 발생할 경우가 있다.

표준SQL상 구문은 이상이 없는데 에러가 발생한다.
이는 MySQL의 특징으로 데이터를 추가나 갱신할 경우 동일한 테이블로 서브쿼리를 사용할 수 없도록 되어 있기 때문이다.
Oracle이나 Postgresql에서는 문제 없이 실행된다.
서브쿼리의 FROM 구는 임시테이블로 다룰수 있으므로 MySQL 아래와 같이 SQL을 변경하면 실행할 수 있다.

from (select id as id, email as email from Person) as id

이메일로 group by를 하여, 각 그룹별 최소 id값들을 가지는 서브쿼리를 만들고
그 값을 제외한 id들을 삭제하도록 코드를 짰다.

delete 
from Person
where id not in 
(select min(id) 
 from (select id as id, email as email from Person) as id
 group by email
 having count(*) >= 1
);
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글