• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

196. subquery로 풀 때, 궁금한 점

23.12.10 01:45 작성 조회수 158

0

수업내용은 이해했습니다. 그래서 196번을 서브쿼리로 다시 풀어봤어요.

 

DELETE

FROM person

WHERE id NOT IN(

SELECT MIN(p.id)

FROM person p

GROUP BY p.email

)

 

에러가 나서 강사님 풀이와 비교해서 차이점은 찾았어요.

제가 생각해본 코드로 풀면 왜 에러가 날까요?

다시한 번 SELECT/FROM으로 감싸줘야하는? 이유가 궁금해요.

이해가 안되면, 다음에도 이렇게 코드 짤 것 같아서 여쭤봅니다!

 

답변 2

·

답변을 작성해보세요.

0

update / insert / delete 쿼리에서는 변경하려는 테이블(from 절에 쓴 테이블로 여기서는 person)을 직접 참조할 수 없어서 서브쿼리로 한 번 묶어줄 필요가 있습니다.

더 자세히 알고 싶으시면 stackoverflow를 참고하시길 바랍니다.
https://stackoverflow.com/questions/4429319/you-cant-specify-target-table-for-update-in-from-clause

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.12

안녕하세요, 인프런 AI 인턴입니다.

제시해주신 SQL 문은 테이블 person에서 각 email이 같은 그룹에 대하여 id값이 가장 작은 레코드를 제외한 나머지 레코드를 삭제하려는 의도로 작성된 서브쿼리를 포함하고 있습니다.

이러한 문제가 발생하는 이유 중 하나는, MySQL 등 일부 데이터베이스에서는 동일한 테이블에 대해 DELETE 문과 서브쿼리에서 동시에 접근할 때, 동시성 문제를 피하기 위해 제한을 두고 있기 때문입니다. 서브쿼리에서 person 테이블을 참조할 때 ‘Materialization’이라는 과정을 통해 일시적인 테이블을 생성하고, DELETE에서는 이 일시적인 테이블의 결과를 사용하도록 합니다.

서브쿼리를 한 번 더 SELECT/FROM으로 감싸주는 것은 MySQL 등에서 위와 같은 제한을 우회하기 위한 일반적인 해결 방법이 됩니다. 이를 통해 내부 서브쿼리가 먼저 평가되어 일시적인 결과가 만들어지고, 그 결과를 바탕으로 외부에서 DELETE 작업이 수행될 수 있게 합니다.

오류의 정확한 내용을 보지 않고는 확실하게 말씀드리기 어려우나, 이러한 문제 때문에 오류가 발생한 것으로 추정됩니다. 혹시 DELETE 문 실행 시 특정 오류 메시지가 출력됐다면, 그 메시지를 바탕으로 더 정확한 원인 판단과 해결 방안을 찾을 수 있을 것입니다.

질문에 더 자세한 도움이 필요하시다면, 해당 강의의 커뮤니티 질문&답변 게시판에 질문해주시면 강사님께서 확인하시고 답변해 주실 것입니다.