👇 sql
SELECT emp.*, edu.edu_no, edu.edu_period, edu.edu_name, edu.edu_major, edu.edu_status
FROM emp240119 emp
LEFT JOIN education edu ON emp.e_code = edu.e_code
WHERE emp.e_code =:x
ORDER BY edu.edu_no;
👇 mapper
<select id="empLists" parameterType="int" resultType="map">
<!-- 직원의 상세정보 및 학력정보를 함께 조회하는 쿼리 -->
SELECT
emp.e_code,
emp.e_name,
emp.e_gender,
emp.e_phone,
emp.e_join,
emp.e_leave,
emp.e_address,
emp.e_authority,
emp.e_email,
emp.e_current,
emp.e_rank,
emp.e_password,
emp.e_term,
edu.edu_no,
edu.edu_period,
edu.edu_name,
edu.edu_major,
edu.edu_status
FROM emp240119 emp LEFT JOIN education edu
ON emp.e_code = edu.e_code
WHERE emp.e_code = #{e_code}
ORDER BY edu.edu_no
</select>
</mapper>
위 쿼리문으로 직원 전체 목록을 출력하려고 하니
java.sql.SQLException: 부적합한 열 유형: 1111
에러가 발생했다. controller, service, dao를 모두 확인했을 때 에러가 보이지는 않았고 위 쿼리문에서 WHERE절을 삭제했더니 전체 직원 목록이 출력되었다.
수정(1)을 통해 전체 직원 목록이 출력되기는 하였으나 한 직원의 학력이 고등학교, 대학교, 대학원과 같이 여러 학력이 존재하기 때문에 한 명의 직원이 2~3번씩 반복 출력되는 문제가 발생하였다.
이를 해결하기 위해 쿼리문을 수정하고자 하였다.
아래와 같이 case~then문을 사용하면 하나의 행에 emp정보와 edu정보를 출력할 수 있게 된다.
SELECT
e.E_CODE,
MAX(CASE WHEN edu.EDU_DIVISION = '고등학교' THEN edu.EDU_PERIOD END) AS 고등학교_PERIOD,
MAX(CASE WHEN edu.EDU_DIVISION = '고등학교' THEN edu.EDU_NAME END) AS 고등학교_NAME,
MAX(CASE WHEN edu.EDU_DIVISION = '고등학교' THEN edu.EDU_MAJOR END) AS 고등학교_MAJOR,
MAX(CASE WHEN edu.EDU_DIVISION = '대학교' THEN edu.EDU_PERIOD END) AS 대학교_PERIOD,
MAX(CASE WHEN edu.EDU_DIVISION = '대학교' THEN edu.EDU_NAME END) AS 대학교_NAME,
MAX(CASE WHEN edu.EDU_DIVISION = '대학교' THEN edu.EDU_MAJOR END) AS 대학교_MAJOR,
MAX(CASE WHEN edu.EDU_DIVISION = '대학원' THEN edu.EDU_PERIOD END) AS 대학원_PERIOD,
MAX(CASE WHEN edu.EDU_DIVISION = '대학원' THEN edu.EDU_NAME END) AS 대학원_NAME,
MAX(CASE WHEN edu.EDU_DIVISION = '대학원' THEN edu.EDU_MAJOR END) AS 대학원_MAJOR
FROM
EMP240119 e
LEFT JOIN
EDUCATION edu ON e.E_CODE = edu.E_CODE
GROUP BY
e.E_CODE
order by
e.E_CODE;