개발은 처음이라 개발새발

서브쿼리를 활용한 DELETE [LeetCode] 본문

mysql

서브쿼리를 활용한 DELETE [LeetCode]

leon_choi 2023. 5. 30. 09:00
반응형

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

 

Delete Duplicate Emails - LeetCode

Can you solve this real interview question? Delete Duplicate Emails - Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | email | varchar | +-------------+---------+ id is the primary key column for this

leetcode.com

이번에는 DELETE 구문 연습을 가장한 서브쿼리 퀴즈를 한번 풀어보겠습니다.

Input: 
Person table:
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
Output: 
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
Explanation: john@example.com is repeated two times. We keep the row with the smallest Id = 1.

문제를 보면 id  1과 3의 email이 같은 것으로 보입니다. 그리고 이 중복된 것들 중 id의 숫자가 작은 id =1만 살리고 3은 삭제 시켜달라는 문제입니다. 이렇게만 보면 "DELETE FROM Person WHERE id =3 ;"으로 끝낼 수 있지만 그렇게 하면 퀴즈가 아니겠죠? 문제는 결국 단순 id =3을 삭제해달라는 것이 아니라 이렇게 중복값이 나왔을 때 id가 작은 값만 남겨달라는 겁니다. 일단 그러면 id가 작은 걸 찾아야 합니다.

#중복된 email 값들 중 최소 id 찾기
SELECT mini.min_id
FROM (SELECT email, min(id) AS min_id
      FROM Person 
      GROUP BY email) mini

네 이렇게 서브퀴리를 작성해봤는데요. 서브쿼리는 SELECT, FROM, WHERE 구문에서 다양하게 사용됩니다. 서브쿼리에 대해서는 다음에 더 자세하게 다뤄보겠습니다. 아무튼 이번에는 FROM절에 서브쿼리를 사용해 GROUP BY로 email를 묶고 그중 최소 id 값을 찾았습니다. 여기서 궁금한 점은 SELECT 앞에 mini.min_id는 무엇일까일텐데요. FROM 절에 사용한 서브쿼리를 괄호로 묶고 옆에 mini라고 적었는데요. 이렇게 하면 서브쿼리를 하나의 테이블로 활용할 수 있습니다. 그리고 서브쿼리 안에서 min(id)를 min_id라고 지칭했으니 최소 id를 뽑기 위해서는 mini테이블의 min_id 즉, mini.min_id를 뽑아달라 해야 합니다. 이렇게 서브쿼리를 완성했으니 최종 쿼리를 작성해보겠습니다.

DELETE FROM Person
WHERE id NOT IN (SELECT mini.min_id
                 FROM (SELECT email, min(id) AS min_id
                       FROM Person 
                       GROUP BY email) mini)
_______________________________________________________________
Output
| id | email            |
| -- | ---------------- |
| 1  | john@example.com |
| 2  | bob@example.com  |
반응형