1) Write an SQL query to delete all the duplicate emails, keeping only one unique email with the smallest id.
2) Note that you are supposed to write a DELETE statement and not a SELECT one.
DELETE
구문 사용GROUP BY
사용SELECT email, MIN(id)
FROM person
GROUP BY email
MIN(id)
값만 출력하기 위해 FROM
절 서브쿼리 활용SELECT s.min_id
FROM ( SELECT email, MIN(id) min_id
FROM person
GROUP BY email ) s
📌 HackerRank > Ollivander's Inventory 에서 했던 같은 실수
DELETE FROM
사용WHERE 컬럼명 NOT IN 조건
사용DELETE FROM person
WHERE id NOT IN ( SELECT s.min_id
FROM ( SELECT email, MIN(id) min_id
FROM person
GROUP BY email ) s )
🔍 JOIN 되어있는 테이블에서 관련 데이터 모두 삭제하고 싶을 때
t1
id |
---|
|
2 |
3 |
t2
id | ref |
---|---|
| |
B | 2 |
C | 3 |
DELETE t1, t2
FROM t1
INNER JOIN t2 ON t1.id = t2.ref
WHERE t1.id = 1;
DELETE p1
FROM person p1
INNER JOIN person p2 ON p1.email = p2.email
WHERE p1.id > p2.id
풀이1.
DELETE FROM person
WHERE id NOT IN ( SELECT s.min_id
FROM ( SELECT email, MIN(id) min_id
FROM person
GROUP BY email ) s )
풀이2.
DELETE p1
FROM person p1
INNER JOIN person p2 ON p1.email = p2.email
WHERE p1.id > p2.id