inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

INNER JOIN 으로 저 스스로 DELETE DUPLICATE EMAIL 문제를 풀어봤는데요

해결된 질문

284

김창훈

작성한 질문수 14

1

DELETE FROM Person

WHERE id IN(

SELECT p2.id

FROM Person AS p1

INNER JOIN Person AS p2

ON p1.email=p2.email

WHERE p1.id<p2.id

);

저스스로 작성해본 코드입니다만

위와 같이 작성 후 제출하면

"You can't specify target table 'p' for update in FROM clause" 라고 뜨더라구요.

저번 선생님께서 알려주신 NOT IN 을 사용한 코드와 거의 비슷한 방식인거 같은데 왜 위와같은 오류가 뜨는지 알 수 있을까요?

sql

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

문제는 서브쿼리에서 DELETE 구문을 사용할 때 발생하는 MySQL의 제한 때문에 발생한 오류인 것 같습니다. MySQL에서는 FROM 절에서 사용한 테이블을 바로 업데이트(DELETE)할 수 없도록 제한을 두고 있습니다. 그래서 에러 메시지 “You can’t specify target table ‘p’ for update in FROM clause”가 나타나게 되는 것이죠.

해결 방법으로는 서브쿼리를 JOIN을 통해 변경하는 방식으로 바꿔주면 됩니다. 아래와 같이 변경해보세요.

DELETE p1 FROM Person AS p1
INNER JOIN Person AS p2 ON p1.email = p2.email
WHERE p1.id < p2.id;

JOIN을 사용하여 Person 테이블을 조인하고, WHERE 절을 통해 중복된 이메일의 경우 id가 더 작은 데이터를 삭제하는 방식입니다.

이렇게 변경해보시면 오류 없이 코드가 실행될 것입니다. 추가적인 질문이 있으시면 얼마든지 물어보세요. 감사합니다.

순위 함수 연습 문제 - 스테디셀러 작가 찾기

0

85

1

문제 내용이 잘못된 것 같습니다.

0

58

2

서브쿼리 질문

0

59

2

[수업질문] 서브쿼리 > null데이터 avg사용 주의

0

72

1

서브쿼리는 언제 작성하는건가요?

0

68

1

안녕하세요 질문드립니다.

0

66

2

Top Earners 문제관련 질문

0

96

2

고급반 cheetsheet

0

149

2

196. Delete Duplicate Emails 좋은 코드 질문

0

141

1

a.id = 1과 b.id=1이 없어도 되는 이유

0

125

0

강의 플랫폼

0

199

3

리트코드 177번 function 풀이중 case when 활용을 위한 서브쿼리 구문을 제출 시 검증에 통과되지 않도록 보강된 듯 하네요

0

205

2

ERD 읽는법에 추가 질문 있어요

0

249

1

lead, lag로 풀이할 시 id 값이 존재하지 않는 경우의 오답

0

356

2

사용자정의함수

0

230

1

이 문제 inner join이 이해가 안됩니다.

0

295

1

평균 함수 사용할 때 주의점과 해결법

0

259

1

196. subquery로 풀 때, 궁금한 점

0

383

2

쿼리성능 질문드립니다.

0

313

1

리트코드 highest department salary 문제

0

258

2

The report 문제 order by부분 질문

0

269

2

리트코드 서브쿼리 문제 질문

0

420

1

DEPARTMENT HIGHEST SALARY 서브쿼리 문제 문의

0

235

1

서브쿼리의 활용사례 및 조인관련질문

0

284

1