1231 개발일지

Yesol Lee·2021년 12월 31일
0

개발일지 - 2021

목록 보기
20/20

오늘 한 일

다음주부터 여러 테이블 join해서 가져오는 기능 구현하기 위해 미리 쿼리 작성하는 연습을 했다.

총 5개 테이블에서 데이터를 가져와야 한다.

  1. 출장 테이블(BT)에서 bt_id
  2. 출장 관련자(BTR)에서 bt_role_id, user_id, user_type (bt.bt_id = btr.bt_id)
  3. 사용자(EMP)에서 user_name, user_dep_code, user_pos_code (btr.user_id = emp.emp_no)
  4. 부서(DEP)에서 dep_name (emp.dep_code = dep.dep_code)
  5. 직급(POS)에서 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";

미리 쿼리도 짜 놨으니 다음주엔 진짜 프로젝트 수정 들어가야겠다..

profile
문서화를 좋아하는 개발자

0개의 댓글