TIL

220309 [SQL] (VIEW / MERGE INTO)

하차모 2023. 3. 9. 17:00

1. VIEW (가상 테이블)

  하나 이상의 테이블이나 다른 뷰를 사용해 가상의 테이블을 만들 수 있다. 뷰는 물리적으로 정의되지 않아, 논리적으로만 존재한다.

-- VIEW 생성
CREATE VIEW (뷰 이름) AS
SELECT (컬럼)
FROM (테이블 명)
WHERE (조인 조건);

-- 사원 테이블과 부서 테이블로 뷰 생성
CREATE VIEW EMP_VIEW AS
SELECT EMPNO, ENAME, EMP.DEPTNO, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
-- 뷰 삭제
DROP VIEW EMP_VIEW;

 

2. MERGE INTO

MERGE INTO (테이블 명)
USING DUAL -- 단일 테이블일 시 DUAL
ON (조건)
WHEN MATCHED THEN 
	-- 조건이 참이면 실행할 쿼리 (테이블명 생략)
WHEN NOT MATCHED THEN
	-- 조건이 거짓이면 실행할 쿼리 (테이블명 생략)
;
-- 유저 아이디와 장바구니에 담는 상품 코드가 장바구니 테이블에 이미 존재한다면 수량, 가격 UPDATE
-- 존재하지 않는다면 INSERT
MERGE INTO SHOP_CART
USING DUAL
ON (ITEM_CODE = #{itemCode} AND MEM_ID = #{memId})
WHEN MATCHED THEN 
    UPDATE 
    SET 
    CART_AMOUNT = CART_AMOUNT + #{cartAmount}
    , TOTAL_PRICE = (SELECT ITEM_PRICE
                    FROM SHOP_ITEM
                    WHERE ITEM_CODE = #{itemCode}) * (CART_AMOUNT + #{cartAmount})
    WHERE ITEM_CODE = #{itemCode} 
    AND MEM_ID = #{memId}
WHEN NOT MATCHED THEN
    INSERT (
        CART_CODE
        , ITEM_CODE
        , MEM_ID
        , CART_AMOUNT
        , TOTAL_PRICE
    ) VALUES (
        (SELECT 'CART_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(CART_CODE, 6))), 0) + 1, 3, '0') 
        FROM SHOP_CART)
        , #{itemCode}
        , #{memId}
        , #{cartAmount}
        , (SELECT ITEM_PRICE
            FROM SHOP_ITEM
            WHERE ITEM_CODE = #{itemCode}) * #{cartAmount}
    )
;