INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
VALUES (50 ,'ORACLE', 'BUSAN');
INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
VALUES (60 ,'SQL', 'ILSAN');
INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
VALUES (70 ,'SELECT', 'INCHEON');
INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
VALUES (80 ,'DML', 'BUNDANG');
INSERT INTO CHAP10HW_EMP
VALUES(7201, 'TEST_USER1', 'MANAGER', 7788, TO_DATE('2016-01-02', 'YYYY-MM-DD'), 4500, NULL, 50);
INSERT INTO CHAP10HW_EMP
VALUES(7202, 'TEST_USER2', 'CLERK', 7201, TO_DATE('2016-02-21', 'YYYY-MM-DD'), 1800, NULL, 50);
INSERT INTO CHAP10HW_EMP
VALUES(7203, 'TEST_USER3', 'ANALYST', 7201, TO_DATE('2016-04-11', 'YYYY-MM-DD'), 3400, NULL, 60);
INSERT INTO CHAP10HW_EMP
VALUES(7204, 'TEST_USER4', 'SALESMAN', 7201, TO_DATE('2016-05-31', 'YYYY-MM-DD'), 2700, 300, 60);
INSERT INTO CHAP10HW_EMP
VALUES(7205, 'TEST_USER5', 'CLERK', 7201, TO_DATE('2016-07-20', 'YYYY-MM-DD'), 2600, NULL, 70);
INSERT INTO CHAP10HW_EMP
VALUES(7206, 'TEST_USER6', 'CLERK', 7201, TO_DATE('2016-09-08', 'YYYY-MM-DD'), 2600, NULL, 70);
INSERT INTO CHAP10HW_EMP
VALUES(7207, 'TEST_USER7', 'LECTURER', 7201, TO_DATE('2016-10-28', 'YYYY-MM-DD'), 2300, NULL, 80);
INSERT INTO CHAP10HW_EMP
VALUES(7208, 'TEST_USER8', 'STUDENT', 7201, TO_DATE('2018-03-09', 'YYYY-MM-DD'), 1200, NULL, 80);
UPDATE CHAP10HW_EMP
SET DEPTNO = 70
WHERE SAL > (SELECT AVG(SAL)
FROM CHAP10HW_EMP
WHERE DEPTNO = 50);
제대로 잘 작성했는데 이런 결과가 나왔다. 원인이 뭘까?
13:56 해결 완료!
ROLLBACK을 사용해도 2번째 사진처럼 이미 망가진 데이터가 계속해서 출력이 됐기 때문에
문제를 해결하기 위해서 일단은 DROP을 사용해 문제가 발생한 테이블을 삭제했다.
DROP TABLE CHAP10HW_EMP;
그리고 CREATE로 실습용 테이블을 복사 생성 → Q2의 데이터를 입력해주니 값이 정상적으로
들어간 것을 확인. ORDER BY를 하지 않아서 순서가 뒤죽박죽이라 사용해서 정렬해줬다.
(ORDER BY도 사용이 계속 안되길래 원인을 보니 SELECT문과 따로 사용해서 그랬던 것 !
UPDATE CHAP10HW_EMP
SET SAL = SAL * 1.1,
DEPTNO = 80
WHERE HIREDATE > (SELECT MIN(HIREDATE)
FROM CHAP10HW_EMP
WHERE DEPTNO = 60);
SELECT * -- 항상 UPDATE를 실행하기 전에는 SELECT로 바뀌는 값이 잘 지정됐는지 확인해야한다
FROM CHAP10HW_EMP
WHERE DEPTNO = 80;
DELETE FROM CHAP10HW_EMP
WHERE EMPNO IN (SELECT E.EMPNO
FROM CHAP10HW_EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
AND S.GRADE = 5);
SELECT * -- DELETE 전에 급여 등급이 5인 사원을 확인
FROM CHAP10HW_EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
AND S.GRADE = 5;
처음에 서브쿼리의 SALGRADE를 어디의 SAL과 비교할 지 지정하지 않아서 오류가 났었다.
그 부분을 수정하고 CHAP10HW_EMP 의 EMPNO에 SELECT 해온 E.EMPNO를 IN연산자를 사용해서 DELETE의 WHERE을 지정해줬다!
아직은 책을 앞뒤로 찾으면서 문제를 풀어 나가고 있지만 계속 하다 보면 좋은 결과를 얻을 수 있지 않을까… ?