작성
·
295
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 인턴입니다.
제시해주신 SQL 문은 테이블 person
에서 각 email
이 같은 그룹에 대하여 id
값이 가장 작은 레코드를 제외한 나머지 레코드를 삭제하려는 의도로 작성된 서브쿼리를 포함하고 있습니다.
이러한 문제가 발생하는 이유 중 하나는, MySQL 등 일부 데이터베이스에서는 동일한 테이블에 대해 DELETE
문과 서브쿼리에서 동시에 접근할 때, 동시성 문제를 피하기 위해 제한을 두고 있기 때문입니다. 서브쿼리에서 person
테이블을 참조할 때 ‘Materialization’이라는 과정을 통해 일시적인 테이블을 생성하고, DELETE
에서는 이 일시적인 테이블의 결과를 사용하도록 합니다.
서브쿼리를 한 번 더 SELECT
/FROM
으로 감싸주는 것은 MySQL 등에서 위와 같은 제한을 우회하기 위한 일반적인 해결 방법이 됩니다. 이를 통해 내부 서브쿼리가 먼저 평가되어 일시적인 결과가 만들어지고, 그 결과를 바탕으로 외부에서 DELETE
작업이 수행될 수 있게 합니다.
오류의 정확한 내용을 보지 않고는 확실하게 말씀드리기 어려우나, 이러한 문제 때문에 오류가 발생한 것으로 추정됩니다. 혹시 DELETE
문 실행 시 특정 오류 메시지가 출력됐다면, 그 메시지를 바탕으로 더 정확한 원인 판단과 해결 방안을 찾을 수 있을 것입니다.
질문에 더 자세한 도움이 필요하시다면, 해당 강의의 커뮤니티 질문&답변 게시판에 질문해주시면 강사님께서 확인하시고 답변해 주실 것입니다.