[LeetCode/Sql] Delete Duplicate Emails

less than 1 minute read

문제정보

어떻게 풀까?

중복된 이메일 중에 가장 작은 ID값을 제외하고 삭제한다. SubQuery를 쓰지 않고 푸는 고급진 방법과 SubQuery를 사용하는 방법이 있다.

문제풀이 (non-SubQuery)

Person 테이블을 별명을 붙여 서로 매핑한 뒤 p1.Id > p2.Id로 골라낸다. p2.Id보다 큰 값이 모두 빠지게 되어 결과적으로 가장 작은 값만 빼고 삭제된다.

DELETE P1
FROM PERSON P1, PERSON P2
WHERE P1.EMAIL = P2.EMAIL 
AND P1.ID > P2.ID;

문제풀이 (SubQuery)

서브쿼리로 EMAIL을 Grouping 한 후 MIN(ID)를 제외한 값들을 삭제하게 한다. 서브쿼리를 두 번 감싼 이유는 한 번만 감싸면 아래와 같은 오류가 발생한다.

You can’t specify target table ‘person’ for update in FROM clause

FROM절에 있는 내용을 타게팅 할 수 없기 때문에 서브쿼리로 한 번 더 감싼다.

DELETE 
FROM PERSON 
WHERE ID NOT IN 
(
    SELECT T.ID FROM
    (
        SELECT MIN(ID) AS ID FROM PERSON GROUP BY EMAIL
    ) AS T
)

Leave a comment