2026_기본모의고사_01회
-5. 인기강사처리 쿼리 7/7
사용현황 테이블을 제거하지 않았더니 쿼리 실행이 되지 않았고, 지우니 실행이 됐습니다. 지워야 하는 것은 알겠는데 강의보면 사용하지 않으니 지워야 한다고 설명해주셨으나, 왜 지우지 않으면 실행되지 않는지는 설명해주시지 않았습니다. 왜 지우지 않으면 실행되지 않을까요?
안녕하세요.
이유는 업데이트 대상인 <강사> 테이블을 바깥쪽에서 갱신하면서, <사용현황> 테이블을 바깥 쿼리에도 같이 조인하면 Access가 그 결과 집합을 “업데이트 가능한 레코드셋”으로 보지 못할 수 있기 때문입니다.
이 문제의 의도는 사실 구조가 단순합니다. 바깥쪽에서는 <강사> 테이블만 업데이트하고, <사용현황>은 하위 쿼리에서 조건을 판별하는 용도로만 써야 합니다.
예를 들면 정답 구조는 대략 이런 형태입니다.
UPDATE 강사
SET 강사.비고 = "인기강사"
WHERE 강사.강사코드 In
(
SELECT 사용현황.강사코드
FROM 사용현황
GROUP BY 사용현황.강사코드
HAVING Count(사용현황.개강코드) >= 12
);여기서는 바깥쪽 업데이트 대상이 <강사> 하나뿐이라서 Access가 어느 레코드를 수정해야 하는지 명확합니다.
반대로 바깥쪽에 <사용현황>까지 추가해서
강사 INNER JOIN 사용현황형태로 만들어 놓으면, 강사 1명에 사용현황 여러 건이 연결되는 1:N 구조 때문에 동일한 강사 레코드가 조인 결과에서 여러 번 나타날 수 있습니다. 게다가 하위 쿼리에서도 다시 <사용현황>을 사용하므로, Access 입장에서는 바깥 쿼리의 조인 결과를 통해 어떤 레코드를 안정적으로 업데이트해야 하는지가 복잡해집니다.
즉 핵심은,
<사용현황>은 “수정할 테이블”이 아니라 “12개 이상 개강했는지 판단하기 위한 테이블”
이라는 점입니다.
그래서 이 유형에서는 보통
바깥 UPDATE → 강사
하위 쿼리 → 사용현황으로 분리해야 합니다.
쉽게 기억하면 “In + 하위 쿼리로 대상자를 찾는 업데이트 쿼리에서는, 조건 판별용 상세 테이블을 바깥 쿼리에 다시 조인하지 않는 것이 안전하다”고 보시면 됩니다.
즐거운 하루 되세요.
-
관리자2026-09-02 10:02:46
안녕하세요.
이유는 업데이트 대상인
<강사>테이블을 바깥쪽에서 갱신하면서,<사용현황>테이블을 바깥 쿼리에도 같이 조인하면 Access가 그 결과 집합을 “업데이트 가능한 레코드셋”으로 보지 못할 수 있기 때문입니다.이 문제의 의도는 사실 구조가 단순합니다. 바깥쪽에서는
<강사>테이블만 업데이트하고,<사용현황>은 하위 쿼리에서 조건을 판별하는 용도로만 써야 합니다.예를 들면 정답 구조는 대략 이런 형태입니다.
UPDATE 강사 SET 강사.비고 = "인기강사" WHERE 강사.강사코드 In ( SELECT 사용현황.강사코드 FROM 사용현황 GROUP BY 사용현황.강사코드 HAVING Count(사용현황.개강코드) >= 12 );여기서는 바깥쪽 업데이트 대상이
<강사>하나뿐이라서 Access가 어느 레코드를 수정해야 하는지 명확합니다.반대로 바깥쪽에
<사용현황>까지 추가해서강사 INNER JOIN 사용현황형태로 만들어 놓으면, 강사 1명에 사용현황 여러 건이 연결되는 1:N 구조 때문에 동일한 강사 레코드가 조인 결과에서 여러 번 나타날 수 있습니다. 게다가 하위 쿼리에서도 다시
<사용현황>을 사용하므로, Access 입장에서는 바깥 쿼리의 조인 결과를 통해 어떤 레코드를 안정적으로 업데이트해야 하는지가 복잡해집니다.즉 핵심은,
<사용현황>은 “수정할 테이블”이 아니라 “12개 이상 개강했는지 판단하기 위한 테이블”이라는 점입니다.
그래서 이 유형에서는 보통
바깥 UPDATE → 강사 하위 쿼리 → 사용현황으로 분리해야 합니다.
쉽게 기억하면 “In + 하위 쿼리로 대상자를 찾는 업데이트 쿼리에서는, 조건 판별용 상세 테이블을 바깥 쿼리에 다시 조인하지 않는 것이 안전하다”고 보시면 됩니다.
즐거운 하루 되세요.