KEEP GOING

[MySQL] LeetCode 196번 : Delete Duplicate Emails 본문

code review/sql

[MySQL] LeetCode 196번 : Delete Duplicate Emails

jmHan 2022. 1. 24. 13:58
반응형

 

https://leetcode.com/problems/delete-duplicate-emails/

 

Delete Duplicate Emails - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

이메일이 중복된 경우, id 값이 작은 값을 제외하고 제거해줘야 한다. 이를 구현하면 아래와 같이 풀이할 수 있다. 

 

 

1. 정답인 코드 

 

[INNER JOIN을 사용한 풀이]

DELETE p1 FROM Person p1, Person p2 WHERE p1.email = p2.email AND p1.id > p2.id;

 

DELETE p1 
FROM Person p1 INNER JOIN Person p2 ON p1.email = p2.email
WHERE p1.id > p2.id;

 

INNER JOIN을 수행할 경우 다음과 같이 테이블이 조인되는데 p2 id 보다 p1 id 값이 큰 경우로 4번째 row 값이 걸리게 된다. 

이를 P1 테이블에서 삭제해주면 다음과 같은 결과가 도출된다. 

 

[서브쿼리를 사용한 풀이]

DELETE FROM Person WHERE id NOT IN(
             SELECT Tmp.min_id
             FROM( 
                  SELECT MIN(id) AS min_id
                  FROM Person
                  GROUP BY email
                  )Tmp
            );

 

 

2. 틀린 코드 

DELETE FROM Person WHERE id NOT IN(
              SELECT MIN(id)
              FROM Person
              GROUP BY email
            );

MySQL에서 DELETE문은 하위절에서 동일한 테이블에 접근할 수 없도록 설계되어 있다. 따라서 NOT IN 절에서 Person 테이블에 접근하고 싶다면, SELECT 문으로 새 테이블을 생성하고 원하는 데이터에 접근해야만 한다. 따라서 위에 서브 쿼리를 사용한 풀이의 방식으로 해결해야 한다. 

반응형
Comments