INSERT DELETE UPDATE 세가지 이벤트가 일어났을때 자동으로 갱신해주는프로그램 >> 트리거
거의 대부분의 업무프로그램에서 사용되어짐
오늘이 2005년 5월 31일이라고 가정하고 5월 입고 및 판매실적을 조회하여 재고수불테이블을 갱신하시오 (우리는 지금 트리거가 없으니꼐......) (자료를 모았다가 한번에 처리해주는 형식)
메인쿼리 > 재고수불업뎃
서브쿼리 > 입/출고수량조회 (해서 메인쿼리의 업뎃을 지원해주기)
2005년 5월 입/출고조회 (제품별 입고수량 및판매수량 집계
BUYPROD 에 BUYDATE와 CART테이블의 CART_DATE가 다르기떄문에 둘중하나라도 기간에 안맞으면 안나와버림..
우선 입고, 판매실적 조회해야함
SELECT C.PROD_ID 제품코드, A.IAMT 입고수량, B.OAMT 판매수량
FROM PROD C ,
(SELECT BUY_PROD,
SUM(BUY_QTY) IAMT
FROM BUYPROD
WHERE BUY_DATE BETWEEN '20050501' AND '20050531'
GROUP BY BUY_PROD) A,
(SELECT CART_PROD, SUM(CART_QTY) OAMT
FROM CART
WHERE CART_NO LIKE '200505%'
GROUP BY CART_PROD) B
WHERE C.PROD_ID = B.CART_PROD
AND C.PROD_ID=A.BUY_PROD;
아우터조인안한상태
SELECT C.PROD_ID 제품코드, A.IAMT 입고수량, B.OAMT 판매수량
FROM PROD C ,
(SELECT BUY_PROD,
SUM(BUY_QTY) IAMT
FROM BUYPROD
WHERE BUY_DATE BETWEEN '20050501' AND '20050531'
GROUP BY BUY_PROD) A,
(SELECT CART_PROD, SUM(CART_QTY) OAMT
FROM CART
WHERE CART_NO LIKE '200505%'
GROUP BY CART_PROD) B
WHERE C.PROD_ID = B.CART_PROD(+)
AND C.PROD_ID=A.BUY_PROD(+);
아우터조인넣어주니까(입고만잇고 출고는 없고 출고만 있고 입고는 없는 제품이있으니까)
입고만있고 출고는없는거 이런거까지 NULL로 나옴 NVL 씌워주면
근데 저런 (+) 이거붙는 일반외부조인은 일반조건이 부여되어있을때 외부조인의 결과가 아닌 내부조인의 결과를 얻게된다. 내부조인이 되면 한쪽이 해당안되는 (입고만있고 출고는0인경우)는 무시되어 사라져버림
그래서 안시아우터조인 혹은 서브쿼리를 써서 해결해야한다. 그래서 서브쿼리안에서 일반조건을 해결해버린거임
또 일반외부조인쓸때 두번째로 조심해야할거는 지금은 (+)가 CART_PROD랑 BUY_PROD에 붙었는데 PROD_ID에 두번붙으면 안됨 (즉 하나의 테이블이 두번확장되는일이 일어나면 안된다는 말임)
프롬절의 서브쿼리는 가상의 테이블인 VIEW를 생성한다.
지금까진 서브쿼리였고
메인쿼리
REMAIN_J_00은 기초재고니까 제외하고 I,O,J99,DATE를 변경시켜줘야함
UPDATE REMAIN R
SET (REMAIN_I,REMAIN_O,REMAIN_J_99,REMAIN_DATE)=
( SELECT REMAIN_I+TBLA.TIAMT,REMAIN_O+TBLA.TOAMT, REMAIN_J_99+TBLA.TIAMT-TBLA.TOAMT,'20050531'
FROM ( SELECT C.PROD_ID PID, NVL(A.IAMT,0) TIAMT, NVL(B.OAMT,0) TOAMT
FROM PROD C ,
(SELECT BUY_PROD,
SUM(BUY_QTY) IAMT
FROM BUYPROD
WHERE BUY_DATE BETWEEN '20050501' AND '20050531'
GROUP BY BUY_PROD) A,
(SELECT CART_PROD, SUM(CART_QTY) OAMT
FROM CART
WHERE CART_NO LIKE '200505%'
GROUP BY CART_PROD) B
WHERE C.PROD_ID = B.CART_PROD(+)
AND C.PROD_ID=A.BUY_PROD(+))TBLA
WHERE REMAIN_PROD=TBLA.PID
)
WHERE REMAIN_YEAR='2005';
'학원수업_Oracle' 카테고리의 다른 글
201103 (0) | 2020.11.03 |
---|---|
201103 VIEW (0) | 2020.11.03 |
201102 (0) | 2020.11.02 |
201102 (0) | 2020.11.02 |
테스트2 (0) | 2020.10.30 |