다음주부터 여러 테이블 join해서 가져오는 기능 구현하기 위해 미리 쿼리 작성하는 연습을 했다.
총 5개 테이블에서 데이터를 가져와야 한다.
bt_id
bt_role_id
, user_id
, user_type
(bt.bt_id = btr.bt_id)user_name
, user_dep_code
, user_pos_code
(btr.user_id = emp.emp_no)dep_name
(emp.dep_code = dep.dep_code)pos_name
(emp.pos_code = pos.pos_code)처음엔 select 서브쿼리 안에 여러 컬럼을 가져오려고 했다.
아래 코드는 사용자id를 기준으로 이름, 부서이름, 직급 이름을 검색하는 쿼리로 1개 데이터를 출력한다.
SELECT EMP_Name, POS_NAME, DEP_NAME
FROM EMPLOYEE AS EMP
JOIN POS ON EMP.EMP_Position = POS_CODE
JOIN DEP ON EMP.EMP_Dept = DEP_CODE
WHERE EMP_No = "E-000";
이걸 출장-출장 관련자 select 안에 넣으려고 했더니 아래 에러가 떴다.
에러: Error Code: 1241. Operand should contain 1 column(s)
찾아보니 서브쿼리 select의 결과로 두 개 이상의 column을 반환할 수 없다고 한다.. 그래서 user_name, pos_name, dep_name, pos_code, dep_code을 각각 서브쿼리로 가져왔더니 코드가 너무 길어졌다. 그래서 부서, 직급 정보만 서브쿼리로 가져오기로 했다. 그랬더니 내가 원하는대로 출력이 되었다!
SELECT BT.BT_ID, TRIP_START_DATE, TRIP_END_DATE, LOCATION,
BTR.USER_ID, USER_TYPE, EMP.EMP_Name AS USER_NAME,
EMP.EMP_Dept AS USER_DEPT_CODE,
EMP.EMP_Position AS USER_POS_CODE,
(SELECT POS_NAME
FROM EMPLOYEE AS EMP
JOIN POS ON EMP.EMP_Position = POS_CODE
WHERE EMP.EMP_No = BTR.USER_ID) AS USER_POS_NAME,
(SELECT DEP_NAME
FROM EMPLOYEE AS EMP
JOIN DEP ON EMP.EMP_Dept = DEP_CODE
WHERE EMP.EMP_No = BTR.USER_ID) AS USER_DEP_NAME
FROM tbbusinesstrip AS BT
JOIN tbbtrole AS BTR ON BT.BT_ID = BTR.BT_ID
JOIN employee AS EMP ON EMP.EMP_No = BTR.USER_ID
WHERE BT.BT_ID = "BT-00360";
미리 쿼리도 짜 놨으니 다음주엔 진짜 프로젝트 수정 들어가야겠다..