4 정답
SELECT '관리자' gubun, a.emp_no, b.salary
FROM dept_manager a
INNER JOIN salaries b
ON a.emp_no = b.emp_no
WHERE a.dept_no = 'd007'
AND SYSDATE() BETWEEN a.from_date AND a.to_date
AND SYSDATE() BETWEEN b.from_date AND b.to_date
UNION ALL
SELECT '사원', a.emp_no, b.salary
FROM dept_emp a
INNER JOIN salaries b
ON a.emp_no = b.emp_no
WHERE a.dept_no = 'd007'
AND SYSDATE() BETWEEN a.from_date AND a.to_date
AND SYSDATE() BETWEEN b.from_date AND b.to_date;
실행결과
해설 Sales 부서의 관리자 정보는 dept_manager 테이블에 있고, 급여는 salaries 테이블에 있습니다. 따라서 두 테이블을 emp_no 칼럼을 이용해 내부 조인합니다. 그리고 WHERE 절에서 부서 코드가 ‘d007’인 건을 확인하고 다시 SYSDATE() 함수로 dept_manager 테이블의 from_date와 to_date 사이에 있는지를 확인합니다. 또한, salaries 테이블에도 from_date와 to_date 칼럼이 있으므로 이 역시 같은 조건으로 확인합니다. 마지막으로 SELECT 절에 사번(a.emp_no)과 급여(b.salary)를 명시하는데, 관리자를 구분하기 위해 ‘관리자’ gubun이라는 가상 칼럼을 맨 앞에 명시합니다.
두 번째로 Sales 부서에 속한 사원의 급여를 조회해야 합니다. 부서별 사원 정보는 dept_emp 테이블에 있으므로 이 테이블과 salaries 테이블을 내부 조인합니다. 나머지 조건은 첫 번째 SELECT 문과 같습니다. 마지막으로 ‘사원’이라는 가상 칼럼을 SELECT 문의 첫 번째에 명시해 사원을 구분합니다. 그리고 이 두 SELECT 문을 UNION ALL로 연결합니다. (UNION을 사용해도 결과는 동일합니다).