<재학생>과 <봉사내역> 테이블을 이용하여 시수의 합계가 10이상인 학생의 '비고' 필드의 값을 '우수 봉사 학생' 으로 변경하는 <우수봉사학생처리> 업데이트 쿼리를 작성한 후 실행하시오. (In 연산자와 하위 쿼리 사용) 이게 문제인데 해설에 in (select 학번 from 봉사내역 group by 학번 having sum(시수)>=10) 이렇게 되어있는데 책에 실행을 누르면 "5행을 새로 고칩니다."라는 메시지가 떠야 한다는데 저는 "21행을 새로 고칩니다."가 뜹니다... 똑같이 했는데 무슨 문제일까요?
안녕하세요.
이 경우 가장 가능성이 높은 원인은 바깥쪽 업데이트 쿼리에 <봉사내역> 테이블까지 추가한 경우입니다.
문제에서 “<재학생>과 <봉사내역> 테이블을 이용”한다고 되어 있어 두 테이블을 쿼리 디자인 화면에 모두 추가하기 쉽지만, In 연산자와 하위 쿼리를 사용하라는 문제에서는 바깥쪽에는 <재학생>만 있어야 합니다. <봉사내역>은 하위 쿼리 안에서만 사용합니다.
정답 구조는 다음과 같아야 합니다.
UPDATE 재학생
SET 재학생.비고 = "우수 봉사 학생"
WHERE 재학생.학번 In
(
SELECT 학번
FROM 봉사내역
GROUP BY 학번
HAVING Sum(시수) >= 10
);여기서 하위 쿼리는 먼저 봉사내역을 학번별로 묶어 시수 합계가 10 이상인 학생만 찾습니다. 예를 들어 그 학생이 5명이면 바깥쪽 <재학생> 테이블에서 그 5명만 업데이트되므로 “5행을 새로 고칩니다.”가 나오는 것이 정상입니다.
반대로 디자인 화면에 재학생과 봉사내역을 둘 다 올려놓고 연결해 놓으면 SQL이 대략 다음처럼 될 수 있습니다.
UPDATE 재학생
INNER JOIN 봉사내역
ON 재학생.학번 = 봉사내역.학번
SET 재학생.비고 = "우수 봉사 학생"
WHERE 재학생.학번 In
(
SELECT 학번
FROM 봉사내역
GROUP BY 학번
HAVING Sum(시수) >= 10
);이 경우 한 학생에게 봉사내역이 여러 건 있기 때문에 학생 5명이 아니라 연결된 봉사내역 레코드까지 포함하여 21행처럼 크게 잡힐 수 있습니다.
따라서 디자인 보기에서 확인해 보세요. 위쪽 테이블 영역에 <재학생>만 있어야 합니다. <봉사내역> 테이블이 보인다면 삭제하세요. 삭제한다고 실제 테이블이 삭제되는 것은 아니고, 현재 쿼리에서만 빠지는 것입니다.
그리고 조건에는 다음처럼 입력하면 됩니다.
필드: 학번
테이블: 재학생
조건:
In (SELECT 학번 FROM 봉사내역 GROUP BY 학번 HAVING Sum(시수)>=10)핵심은 재학생 = 업데이트 대상, 봉사내역 = 하위 쿼리에서 조건을 계산하는 자료로 역할을 분리하는 것입니다.
따라서 수식 In (select 학번 from 봉사내역 group by 학번 having sum(시수)>=10) 자체가 같더라도, 쿼리 위쪽에 봉사내역을 추가해 놓았는지 여부에 따라 5행과 21행의 차이가 발생할 수 있습니다.
즐거운 하루 되세요.
-
관리자2026-09-07 09:37:57
안녕하세요.
이 경우 가장 가능성이 높은 원인은 바깥쪽 업데이트 쿼리에
<봉사내역>테이블까지 추가한 경우입니다.문제에서 “
<재학생>과<봉사내역>테이블을 이용”한다고 되어 있어 두 테이블을 쿼리 디자인 화면에 모두 추가하기 쉽지만, In 연산자와 하위 쿼리를 사용하라는 문제에서는 바깥쪽에는<재학생>만 있어야 합니다.<봉사내역>은 하위 쿼리 안에서만 사용합니다.정답 구조는 다음과 같아야 합니다.
UPDATE 재학생 SET 재학생.비고 = "우수 봉사 학생" WHERE 재학생.학번 In ( SELECT 학번 FROM 봉사내역 GROUP BY 학번 HAVING Sum(시수) >= 10 );여기서 하위 쿼리는 먼저 봉사내역을 학번별로 묶어 시수 합계가 10 이상인 학생만 찾습니다. 예를 들어 그 학생이 5명이면 바깥쪽
<재학생>테이블에서 그 5명만 업데이트되므로 “5행을 새로 고칩니다.”가 나오는 것이 정상입니다.반대로 디자인 화면에
재학생과봉사내역을 둘 다 올려놓고 연결해 놓으면 SQL이 대략 다음처럼 될 수 있습니다.UPDATE 재학생 INNER JOIN 봉사내역 ON 재학생.학번 = 봉사내역.학번 SET 재학생.비고 = "우수 봉사 학생" WHERE 재학생.학번 In ( SELECT 학번 FROM 봉사내역 GROUP BY 학번 HAVING Sum(시수) >= 10 );이 경우 한 학생에게 봉사내역이 여러 건 있기 때문에 학생 5명이 아니라 연결된 봉사내역 레코드까지 포함하여 21행처럼 크게 잡힐 수 있습니다.
따라서 디자인 보기에서 확인해 보세요. 위쪽 테이블 영역에
<재학생>만 있어야 합니다.<봉사내역>테이블이 보인다면 삭제하세요. 삭제한다고 실제 테이블이 삭제되는 것은 아니고, 현재 쿼리에서만 빠지는 것입니다.그리고 조건에는 다음처럼 입력하면 됩니다.
필드: 학번 테이블: 재학생 조건: In (SELECT 학번 FROM 봉사내역 GROUP BY 학번 HAVING Sum(시수)>=10)핵심은
재학생= 업데이트 대상,봉사내역= 하위 쿼리에서 조건을 계산하는 자료로 역할을 분리하는 것입니다.따라서 수식
In (select 학번 from 봉사내역 group by 학번 having sum(시수)>=10)자체가 같더라도, 쿼리 위쪽에 봉사내역을 추가해 놓았는지 여부에 따라 5행과 21행의 차이가 발생할 수 있습니다.즐거운 하루 되세요.