본문 바로가기
MySQL/문제풀이

[LeetCode] 서브쿼리 : 196. Delete Duplicate Emails

by MINNI_ 2021. 3. 25.

1. 문제

 

Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique emails based on its smallest Id.

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

Id is the primary key column for this table.

 

For example, after running your query, the above Person table should have the following rows:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

Note:

Your output is the whole Person table after executing your sql. Use delete statement.

 


2. 답

 

  • 1) 서브 쿼리 이용
DELETE FROM person
WHERE id NOT IN (
    SELECT sub.min_id
    FROM (
        SELECT MIN(id) AS min_id, email
        FROM person
        GROUP BY email
    ) sub )
   

- SELECT를 2번 하는 이유?
: sub테이블에서 GROUP BY에 있는 컬럼 email은 SELECT에도 들어가야 한다. 하지만, WHERE절에 id를 비교하기 위해서는 id만을 추출한 테이블과 비교해야 하므로, sub테이블을 FROM절에서 사용하는 서브 쿼리로 만들고, 이를 통해 id만을 추출하는 WHERE절에서 사용하는 서브 쿼리를 만들어 비교한다.

 

  • 2) DELETE에 JOIN 이용
DELETE p1
FROM person p1
INNER JOIN person p2 ON p1. email = p2. email
WHERE p1.id > p2.id

- SELF JOIN 한 결과
  - SELF JOIN 시, 기준에 부합하는 조건이 하나의 컬럼에 2개가 있을 때, 각각의 경우의 수 모두 도출

p1.id    p1.email	      p2.id    p2.email
1        john@example.com     1        john@example.com
1        john@example.com     3        john@example.com
2        bob@example.com      2        bob@example.com
3        john@example.com     1        john@example.com
3        john@example.com     3        john@example.com

- WHERE p1.id > p2.id로 필터링을 거치게 되면, 아래와 같은 결과가 나옴.
  DELETE가 p1을 기준으로 삭제하므로 id가 3번인 행을 삭제하여 결과적으로, id가 1,2만 있는 테이블 도출

p1.id    p1.email           p2.id    p2.email
3        john@example.com   1        john@example.com 

   


3. KEY POINT

 

  • 서브쿼리 : 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문
  • DELETE에 JOIN 이용: JOIN 활용 시, DELETE와 FROM 사이에 영향 끼치는 테이블 이름 적음
  • DELETE table : "DELETE 뒤의 table을 기준" 으로 조건에 만족되는 행을 삭제
  • [ DELETE에 JOIN 참고자료 ] www.mysqltutorial.org/mysql-delete-join/

 

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

 

댓글