KEEP GOING
[MySQL] LeetCode 196번 : Delete Duplicate Emails 본문
반응형
https://leetcode.com/problems/delete-duplicate-emails/
이메일이 중복된 경우, 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 문으로 새 테이블을 생성하고 원하는 데이터에 접근해야만 한다. 따라서 위에 서브 쿼리를 사용한 풀이의 방식으로 해결해야 한다.
반응형
'code review > sql' 카테고리의 다른 글
Comments