• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

리트코드 196 질문입니다.

21.07.23 14:35 작성 조회수 209

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

안녕하세요 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. 셀프 조인은 동일 테이블 안에서 이루어지는 것이기 때문에 셀프 조인이라고 할 수 있습니다.

감사합니다.