출처:
테이블:Person
+-------------+---------+
| 열 이름 | 데이터 유형 |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id는 이 테이블의 기본 키(고유 값을 가진 열)입니다.
이 테이블의 각 행에는 이메일 주소가 포함됩니다. 이메일 주소에는 대문자가 포함되지 않습니다.
중복된 이메일을 모두 삭제하고 , 길이가 가장 짧은 고유한 이메일 하나만 남기는 해결책을 작성하세요 id.
SQL 사용자 여러분, 문장을 작성해야지 문장을 작성해서는 DELETE안 된다는 점에 유의하시기 바랍니다 SELECT.
PersonPandas 사용자 여러분, 수정은 제자리에서 이루어져야 한다는 점에 유의해 주시기 바랍니다 .
스크립트를 실행하면 표 형식의 결과가 표시됩니다 Person. 드라이버는 먼저 코드를 컴파일하고 실행한 다음 표를 표시합니다 . 표의 Person최종 순서는 중요하지 않습니다 .Person
결과 형식은 다음 예시와 같습니다.
예시 1:
입력:
Person 테이블:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+ 출력:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+ 설명: john@example.com이 두 번 반복되었습니다. ID가 가장 작은 행(1)을 유지합니다.
내가 한 풀이
# Write your MySQL query statement below
DELETE p
FROM Person p
JOIN Person e
ON p.email = e.email
WHERE p.id > e.id
트러블 슈팅
우선 DELETE 문에서도 셀프조인이 가능하다, 더 나아가 서브쿼리도 가능하다.
서브 쿼리 사용한 DELETE
-- MySQL/PostgreSQL 예시 (JOIN과 비슷한 원리)
DELETE FROM Person WHERE id NOT IN (SELECT MIN(id) FROM Person GROUP BY email);
-- 또는 이렇게도 가능 (P2를 삭제 대상으로 삼는 경우)
DELETE FROM Person WHERE id IN (SELECT p2.id FROM Person p1 JOIN Person p2 ON p1.email = p2.email WHERE p1.id < p2.id);