테이블에 원하는 데이터가 있으면 그 데이터를 UPDATE하고 없으면 INSERT하는 정말 유용하게 사용되는 문법
- MERGE 문
MERGE문 사용법
MERGE INTO 테이블명
USING 타겟 테이블
ON (타겟 데이터)
WHEN MATCHED THEN
UPDATE SET
컬럼1 = 값1,
컬럼2 = 값2,
...
WHERE 조건
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2 ...) VALUES (값1, 값2...)
WHERE 조건;
MERGE문의 기본 사용법은 위와 같습니다. 다른 DML보다 문법이 복잡한편이라 처음 접하면 사용하기 힘들수도 있다 생각됩니다. 이에 아래 간단한 예제를 준비했습니다.
MERGE문 예제
테스트 테이블 생성
CREATE TABLE TEST_TABLE (
COMPANY_CODE VARCHAR2(10) NOT NULL,--회사코드
COMPANY_NAME VARCHAR2(50) NOT NULL --회사이름
);
MERGE문을 실습하기 위해 간단한 테이블 하나를 생성했습니다. 테이블은 COMPANY_CODE(회사코드)와 COMPANY_NAME(회사이름)으로 이루어져있으며 테이블에 COMPANY_CODE가 '1' 이라는 데이터가 있으면 UPDATE 없으면 INSERT를 해보는 식으로 MERGE문을 만들어보도록 하겠습니다.
MERGE문 실행
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
UPDATE SET COMPANY_NAME = '삼성전자'
WHEN NOT MATCHED THEN
INSERT (COMPANY_CODE, COMPANY_NAME)
VALUES ('1','현대자동차');
위 쿼리를 한번 실행시키면 현대자동차라는 회사명의 데이터가 INSERT됩니다. 아무것도 없는 테이블에 타겟으로 한 COMPANY_CODE = '1' 이라는 데이터가 없으므로 INSERT문이 실행된것입니다. 그렇다면 이제 COMPANY_CODE = 1이라는 데이터가 있으니 이 쿼리를 한번 더 실행시키면 어떻게 될까요?
COMPANY_CODE = '1' 이라는 데이터가 있으므로 UPDATE문이 실행되어 COMPANY_NAME이 현대차에서 삼성전자로 UPDATE됩니다.
UPDATE문 / INSERT문 중 하나만 실행
--데이터가 없을경우에 INSERT
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN NOT MATCHED THEN
INSERT (COMPANY_CODE, COMPANY_NAME)
VALUES ('1','현대자동차');
--데이터가 있을 경우 UPDATE
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
UPDATE SET COMPANY_NAME = '삼성전자'
위와같이 UPDATE와 INSERT를 하나씩만 실행시켜 EXISTS를 쓰는것과 비슷한 느낌으로 사용할수도 있습니다.
데이터가 있을 경우 DELETE 없을 경우 INSERT
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
UPDATE SET COMPANY_NAME = '삼성전자'
DELETE WHERE COMPANY_CODE = '1'
WHEN NOT MATCHED THEN
INSERT (COMPANY_CODE, COMPANY_NAME)
VALUES ('1','현대자동차');
UPDATE절에 DELETE문을 추가할 수도 있습니다. 이 방법은 UPDATE될 값을 평가해서 조건에 맞는 데이터를 삭제하는 역할을 합니다. 주로 위와 같이 데이터가 있을 경우 DELETE 없을 경우 INSERT로 사용됩니다.
데이터 이관
MERGE INTO TEST_TABLE A
USING EX_TABLE B
ON (A.COMPANY_CODE = B.COMPANY_CODE)
WHEN MATCHED THEN
UPDATE SET
A.COMPANY_NAME = B.COMPANY_NAME
WHEN NOT MATCHED THEN
INSERT (A.COMPANY_CODE,A.COMPANY_NAME)
VALUES (B.COMPANY_CODE,B.COMPANY_NAME);
MERGE문은 다양하게 활용됩니다. 테이블끼리 데이터를 이관할때도 유용하게 사용됩니다. 위 예제는 EX_TABLE에있는 데이터를 TEST_TABLE 테이블로 데이터를 이관하는 예제입니다.
'DB' 카테고리의 다른 글
[Oracle] 그룹 함수 over, partition by (1) | 2021.03.11 |
---|---|
[Oracle] 오라클 SYSDATE 사용법 (0) | 2021.03.09 |
[Oracle] MERGE INTO 사용하기 (0) | 2020.01.31 |
[Mysql] You can't specify target table '테이블명' for update in FROM clause (0) | 2019.07.11 |
[Mysql] 모든 공백 제거 하기 (0) | 2019.06.25 |