인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Absolute님의 프로필 이미지
Absolute

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 고급 SQL

[심화] DELETE 문제풀이 + DELETE with INNER JOIN

리트코드 196 질문입니다.

작성

·

307

0

안녕하세요 강사님

1. 제가 작성한 쿼리가 왜 오류로 작동하는지 모르겠습니다. 

2. 이러한 쿼리도 셀프 join이라고 말하나요?

i) 

delete person

from (

    select min(id) as min_id

    from person

    group by email) temp

join person on person.id = temp.min_id

where temp.min_id = person.id

ii)

delete person

from (

    select min(id) as min_id

    from person

    group by email) temp

join person on person.id = temp.min_id

where temp.min_id = person.id

ii)의 결과가,  3 | john@example.com만 남는걸로 봐서 id가 1,2인 행이 삭제된 걸 알 수 있는데 (i) 결과에서는 id가 1,2,3인 행들이 모두 살아남아요, 이유를 모르겠습니다.

추가) 이 문제에서 id를 primary key로 지정했기 때문에 select가 잘 작동안하는건가요?

만약 그런거라면, 제가 primary key를 해제하려고 코드를 작성해보았으나 수정 권한이 없다는 오류가 떠서요..

답변 1

0

canary4651님의 프로필 이미지
canary4651
지식공유자

안녕하세요 Absolute님, Absolute님 !

일단 쿼리를 돌려보면 (i), (ii) 둘다 똑같이 id가 1,2인 데이터들이 삭제되고 3만 남고 있습니다. 

이 문제에서 id를 primary key로 지정했기 때문에 select가 작동이 안되기 보단

쿼리에서 문제가 있어서 id가 3인 결과값이 나오고 있습니다. 

서브쿼리를 이용해서 문제를 푸는 방법으론

DELETE FROM Person 

WHERE Id NOT IN 

(SELECT * 

 FROM(

    SELECT MIN(Id) 

     FROM Person

     GROUP BY Email) as temp);

로 수정하면 원하는 결과값이 나옵니다.

2. 셀프 조인은 동일 테이블 안에서 이루어지는 것이기 때문에 셀프 조인이라고 할 수 있습니다.

감사합니다. 

Absolute님의 프로필 이미지
Absolute

작성한 질문수

질문하기