[Project] DB 설계(4) 학력 테이블과 직원 테이블 조인하기

이슬기·2024년 2월 6일
0

project

목록 보기
25/42

👇 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>

수정 (1)

위 쿼리문으로 직원 전체 목록을 출력하려고 하니
java.sql.SQLException: 부적합한 열 유형: 1111
에러가 발생했다. controller, service, dao를 모두 확인했을 때 에러가 보이지는 않았고 위 쿼리문에서 WHERE절을 삭제했더니 전체 직원 목록이 출력되었다.

수정 (2)

수정(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;

0개의 댓글

관련 채용 정보