본문 바로가기

Programming/Oracle

Merge

728x90
MERGE INTO TARGET_TABLE --update 또는 insert할 table
USING SOURCE_DATA --활용할 data로 table 또는 subquery로 정의할 수 있음
--SOURCE_DATA를 주체로 TARGET_TABLE를 inner join한다고 생각하면 됨
ON ( TARGET_TABLE.COL1 = SOURCE_DATA.COL1
    AND TARGET_TABLE.COL2 = SOURCE_DATA.COL2)
--inner join이 된 경우 UPDATE
WHEN MATCEHED THEN
    UPDATE SET
    	TARGET_TABLE.COL3 = SOURCE_DATA.COL3
        , TARGET_TABLE.COL4 = SOURCE_DATA.COL4
        [WHERE ..]
        [DELETE WHERE ..]
--inner join이 안 된 경우 INSERT
WHEN NOT MATCHED THEN
    INSERT (
        COL1
        , COL2
        , COL3
        , COL4)
    VALUES (
    	SOURCE_DATA.COL1
    	, SOURCE_DATA.COL2
    	, SOURCE_DATA.COL3
    	, SOURCE_DATA.COL4)
;

SOURCE_DATA와 TARGET_TABLE의 inner join 여부에 따라 update또는 insert된다고 생각하면 편함.

WHEN MATCHED THEN에 WHERE절을 추가할 수 있고, 또 DELETE WHERE절을 추가할 수 있음.

UPDATE후에 조건에 안 맞으면 DELETE하는 식으로 지울 때 사용.

WHEN NOT MATCHED THEN은 SOURCE_DATA로 insert한다고 생각하면 편함.

--P_COL1, P_COL2, P_COL3, P_COL4는 파라미터
MERGE INTO TARGET_TABLE --update 또는 insert할 table
USING DUAL --활용할 data로 table 또는 subquery로 정의할 수 있음
ON ( TARGET_TABLE.COL1 = P_COL1
    AND TARGET_TABLE.COL2 = P_CO2)
--inner join이 된 경우 UPDATE
WHEN MATCEHED THEN
    UPDATE SET
    	TARGET_TABLE.COL3 = P_COL3
        , TARGET_TABLE.COL4 = P_COL4
--inner join이 안 된 경우 INSERT
WHEN NOT MATCHED THEN
    INSERT (
        COL1
        , COL2
        , COL3
        , COL4)
    VALUES (
    	P_COL1
    	, P_COL2
    	, P_COL3
    	, P_COL4)
;

DUAL을 활용하여 파라미터만을 활용한 예시, 많이 사용하는 예시

728x90

'Programming > Oracle' 카테고리의 다른 글

KILL SESSION  (0) 2023.01.06
테이블 정보 조회  (0) 2022.11.11
Cursor 사용 방법 3가지  (0) 2022.10.14