학원수업_Oracle

201103

logloglog 2020. 11. 3. 10:29
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