본문 바로가기
TIL - 프로그래밍/SQL

[리트코드] 196. Delete Duplicate Emails - MySQL

by chaemj97 2023. 7. 6.
728x90

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


  • 문제
    • 중복된 email 행 제거하면서 id가 가장 작은 행만 남겨라

  • 풀이1
    • email을 기준으로 그룹화하여 각 그룹에 가장 작은 id를 출력하는 테이블 만들기
    • 위 테이블에 id에 속하지 않는 id 삭제하기
    • MySQL에서 DELETE문은 하위절에서 동일한 테이블에 접근할 수 없다.
  • 코드1
-- 유지해야 하는 데이터
SELECT MIN(id) as min_id, email
FROM Person
GROUP BY email;

-- 위에서 id만 뽑아내기
SELECT sub.min_id
FROM (
    SELECT MIN(id) as min_id, email
    FROM Person
    GROUP BY email
) as sub;

-- 정답
-- 유지해야 하는 id에 해당하지 않는 행 삭제
DELETE 
FROM Person
WHERE id NOT IN (
    SELECT sub.min_id
    FROM (
        SELECT MIN(id) as min_id, eamil
        FROM Person
        GROUP BY email
    ) as sub
);

 

  • 풀이2
    • 셀프 조인 사용 -> email이 같은 경우 
    • 삭제해야하는 행
      • p1.id > p2.id 인 경우 p1 테이블에서 삭제
        • 아래 표에서 파란색 부분
    • DELETE문에서 DELETE와 FROM 사이에 테이블 이름 적으면 그 테이블에서 삭제됨
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
  • 코드2
DELETE p1
FROM Person p1
    INNER JOIN Person p2 ON p1.email = p2.email
WHERE p1.id > p2.id;

 

728x90
반응형

'TIL - 프로그래밍 > SQL' 카테고리의 다른 글

[SQL] WITH 절 / WITH RECURSIVE 절  (0) 2023.07.06
[해커랭크] Challenges - MySQL  (0) 2023.07.06
[리트코드] 627. Swap Salary - MySQL  (0) 2023.07.05
[SQL] DML 공부  (0) 2023.07.05
[SQL] Chapter 1. SQL을 활용한 분석  (0) 2023.07.04

댓글