728x90
https://leetcode.com/problems/delete-duplicate-emails/
- 문제
- 중복된 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 테이블에서 삭제
- 아래 표에서 파란색 부분
- 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 |
댓글