hyeonga_code

Database_64_DML 응용_MERGE UPSERT 본문

Oracle Database

Database_64_DML 응용_MERGE UPSERT

hyeonga 2023. 8. 20. 07:59
반응형

-- Advanced DML
  
    -- MERGE_UPSERT
        -- 데이터베이스 테이블에서 조건에 따라 데이터를 갱신하거나 삽입하는 기능을 제공합니다.
        -- 해당 행이 존재하는 경우 UPDATE를 수행합니다.
        -- 새로운 행일 경우 INSERT를 수행합니다.
        -- 테이블에서 행을 갱신하면서 동시에 불필요한 행을 삭제할 수 있습니다.
            -- MERGE문의 구문에 포함되는 WHERE 절에 DELETE 절을 작성합니다.
        -- 장점
            -- 성능이 향상되고 사용하기 편리합니다.
            -- 데이터 웨어하우징 응용 프로그램에 유용합니다.
        /*
        MERGE INTO table_name table_alias
            USING ( table | view | sub_query ) alias
            ON ( join condirion ) : MERGE 연산이 갱신/삽입을 수행하는 기준이 되는 조건입니다.
            WHEN MATCHED THEN : 중복되는 데이터가 있는 경우
                UPDATE SET
                    column 1 = column_val 1,
                    column 2 = column_val 2
            WHEN NOT MATCHED THEN : 중복되는 데이터가 없는 경우
                INSERT ( column_list )
                VALUES ( collumn_values );
        */
        -- 두 개의 테이블을 중복데이터 없이 합치고 싶은 경우
            -- 새로운 테이블이 생성되지 않습니다.
            -- A 테이블에 B 테이블의 데이터를 붙여넣기 할 수 있습니다.
            -- B 테이블에 A 테이블의 데이터를 붙여넣기 할 수 있습니다.
            -- 중복되는 데이터가 있는 경우 기준이 되는 값을 저장할 수 있도록 합니다.

-- 실습 준비
DROP TABLE oldemp PURGE;

CREATE TABLE oldemp
AS
SELECT employee_id, last_name,job_id, salary, commission_pct, department_id
FROM employees
WHERE department_id IN (10, 80);
    /*
    Table OLDEMP이(가) 생성되었습니다.
    */
    
UPDATE oldemp
SET department_id=200;
    /*
    7개 행 이(가) 업데이트되었습니다.
    */

UPDATE oldemp
SET commission_pct=0.4;
    /*
    7개 행 이(가) 업데이트되었습니다.
    */
    
COMMIT;
    /*
    커밋 완료.
    */


-- OLDEMP 테이블을 조회합니다.
SELECT * FROM oldemp;



-- OLDEMP 테이블과 EMPLOYEES 테이블을 병합합니다.
MERGE INTO oldemp o
USING employees e
ON (o.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
    o.last_name = e.last_name, o.job_id = e.job_id, o.salary = e.salary, o.department_id = e.department_id
DELETE WHERE (e.commission_pct IS NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.last_name,e.job_id, e.salary, e.commission_pct, e.department_id);
    /*
    23개 행 이(가) 업데이트되었습니다.
    */

COMMIT;
    /*
    커밋 완료.
    */

-- 병합한 테이블을 조회합니다.
SELECT * 
FROM oldemp
ORDER BY employee_id;



-- 복구합니다.
ROLLBACK;
    /*
    롤백 완료.
    */    






반응형