본문 바로가기
Oracle

Do it! 오라클로 배우는 데이터베이스 입문 p.240 4번 문제 리뷰

by HTT 2022. 11. 5.

자체 조인, 외부 조인을 알아야 풀 수 있는 문제

SQL> SELECT D.DEPTNO, D.DNAME, E.EMPNO, E.ENAME, E.MGR, E.SAL, E.DEPTNO,
  2         S.LOSAL, S.HISAL, S.GRADE, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
  3  FROM EMP E, DEPT D, SALGRADE S, EMP E2
  4  WHERE E.DEPTNO(+) = D.DEPTNO
  5        AND E.SAL BETWEEN S.LOSAL(+) AND S.HISAL(+)
  6        AND E.MGR = E2.EMPNO(+)
  7  ORDER BY D.DEPTNO, E.EMPNO;

    DEPTNO DNAME                             EMPNO ENAME                       MGR        SAL     DEPTNO      LOSAL      HISAL      GRADE  MGR_EMPNO MGR_ENAME
---------- ---------------------------- ---------- -------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------------
        10 ACCOUNTING                         7782 CLARK                      7839       2450         10       2001       3000          4       7839 KING
        10 ACCOUNTING                         7839 KING                                  5000         10       3001       9999          5
        10 ACCOUNTING                         7934 MILLER                     7782       1300         10       1201       1400          2       7782 CLARK
        20 RESEARCH                           7369 SMITH                      7902        800         20        700       1200          1       7902 FORD
        20 RESEARCH                           7566 JONES                      7839       2975         20       2001       3000          4       7839 KING
        20 RESEARCH                           7788 SCOTT                      7566       3000         20       2001       3000          4       7566 JONES
        20 RESEARCH                           7876 ADAMS                      7788       1100         20        700       1200          1       7788 SCOTT
        20 RESEARCH                           7902 FORD                       7566       3000         20       2001       3000          4       7566 JONES
        30 SALES                              7499 ALLEN                      7698       1600         30       1401       2000          3       7698 BLAKE
        30 SALES                              7521 WARD                       7698       1250         30       1201       1400          2       7698 BLAKE
        30 SALES                              7654 MARTIN                     7698       1250         30       1201       1400          2       7698 BLAKE
        30 SALES                              7698 BLAKE                      7839       2850         30       2001       3000          4       7839 KING
        30 SALES                              7844 TURNER                     7698       1500         30       1401       2000          3       7698 BLAKE
        30 SALES                              7900 JAMES                      7698        950         30        700       1200          1       7698 BLAKE
        40 OPERATIONS
        50 INSA

 

1) 내가 처음 작성한 코드

select d.deptno, d.dname, e.empno, e,ename, e.mgr, e.sal, d.deptno as DEPT_1, 
       s.LOSAL, s.HISAL, s.GRADE, e.mgr as MGR_EMPNO
from emp e, dept d, SALGRADE s
where d.dname = e.empno(+) and e.sal between s.LOSAL and s.HISAL
order by e.empno, d.deptno;

 

2) 정답 참고하여 자체 조인을 써야한다는 걸 알고 두 번째 작성한 코드

(자체 조인은 수업시간에 배우지 않아 써야한다는 걸 모르고 있었다ㄱ-... 하지만 수업듣기 전에 예습으로 한 번 봤었기 때문에 변명이 되지 않는다. 더 열심히 하자.)

 

select d.deptno, d.dname, e.empno, e.ename, e.mgr, e.sal, e.deptno as DEPT_1,
s.LOSAL, s.HISAL, s.GRADE, e2.empno as MGR_EMPNO, e2.ename as MGR_ENAME
from emp e, dept d, SALGRADE s, emp e2
where e.deptno(+) = d.deptno and e.sal between s.LOSAL and s.HISAL and e.mgr = e2.empno
order by e.deptno, d.deptno;

=> d.deptno이 먼저 나오고 e.deptno이  나중에 나오기 때문에 외부조인의 특성상 내용이 없는 e.deptno에 (+)를 써주는 것이 맞음. 하지만 여기서 문제점은 e.deptno에만 (+)를 써줬더니 해결이 되진 않음.

나머지 내용이 null값인 d.deptno, d.dname의 데이터가 출력되지 않는다. 외부조인을 이용하여 다시 작성해본다.

 

3) 세 번째 코드 작성

 

 

 

 

** ORA-00918: column ambiguously defined 에러주의!! ' . '  ' , ' 주의하기

댓글