반응형
MERGE INTO 문
데이터를 처리할 때 데이터의 존재 여부를 SELECT하고 해당 값이 없으면 INSERT 처리, 있으면 UPDATE 처리함
MERGE INTO 문을 사용하면 데이터의 존재 여부를 확인하는 쿼리 (SELECT), 데이터를 삽입하는 쿼리 (INSERT), 데이터를 수정하는 쿼리 (UPDATE)를 한 번에 처리할 수 있다.
MERGE INTO 문 사용 예시
MERGE INTO EXAMPLE_A A -- UPDATE 또는 INSERT할 테이블|뷰
USING EXAMPLE_B B -- 있는지 없는지 조회할 대상이 되는 테이블|뷰|서브쿼리
ON (A.EXAMPLE_NO = B.EXAMPLE_NO)
WHEN MATCHED THEN -- 조건이 일치하는 경우
UPDATE SET A.EXAMPLE_EXNO = B.EXAMPLE_EXNO
, A.EXAMPLE_EXNO2 = B.EXAMPLE_EXNO2
WHEN NOT MATCHED THEN -- 조건이 불일치하는 경우
INSERT (A.EXAMPLE_NO, A.EXAMPLE_EXNO, A.EXAMPLE_EXNO2)
VALUES (B.EXAMPLE_NO, B.EXAMPLE_EXNO, B.EXAMPLE_EXNO2);
단, ON 조건절에 사용할 컬럼을 업데이트하면 오류가 발생함 !
1. 단일 테이블 사용 예시 (DUAL)
MERGE INTO EXAMPLE_A A -- UPDATE 또는 INSERT할 테이블|뷰
USING DUAL
ON (A.EXAMPLE_NO = 1)
WHEN MATCHED THEN -- 조건이 일치하는 경우
UPDATE SET A.EXAMPLE_EXNO = 1
WHEN NOT MATCHED THEN -- 조건이 불일치하는 경우
INSERT (A.EXAMPLE_NO, A.EXAMPLE_EXNO, A.EXAMPLE_EXNO2)
VALUES (1, 1, 1);
단일 테이블에 작업을 할 때, USING 절에 테이블 대신 DUAL을 사용함
2. 두 테이블 조인 사용 예시
MERGE INTO EXAMPLE_A A -- UPDATE 또는 INSERT할 테이블|뷰
USING EXAMPLE_B B -- 있는지 없는지 조회할 대상이 되는 테이블|뷰|서브쿼리
ON (A.EXAMPLE_NO = B.EXAMPLE_NO)
WHEN MATCHED THEN -- 조건이 일치하는 경우
UPDATE SET A.EXAMPLE_EXNO = B.EXAMPLE_EXNO
, A.EXAMPLE_EXNO2 = B.EXAMPLE_EXNO2
WHEN NOT MATCHED THEN -- 조건이 불일치하는 경우
INSERT (A.EXAMPLE_NO, A.EXAMPLE_EXNO, A.EXAMPLE_EXNO2)
VALUES (B.EXAMPLE_NO, B.EXAMPLE_EXNO, B.EXAMPLE_EXNO2);
EXAMPLE_B 테이블이 EXAMPLE_A 테이블에 존재하는 경우 EXAMPLE_B 테이블로 UPDATE, INSERT함
3. 서브 쿼리 사용 예시
MERGE INTO EXAMPLE_A A -- UPDATE 또는 INSERT할 테이블|뷰
USING (
SELECT B.EXAMPLE_NAME
FROM EXAMPLE_C AS C
INNER JOIN EXAMPLE_B AS B
ON A.EXAMPLE_NO = B.EXAMPLE_NO
) AS EX
ON (A.EXAMPLE_NO = EX.EXAMPLE_NO)
WHEN MATCHED THEN -- 조건이 일치하는 경우
UPDATE SET A.EXAMPLE_EXNO = EX.EXAMPLE_EXNO
, A.EXAMPLE_EXNO2 = EX.EXAMPLE_EXNO2
WHEN NOT MATCHED THEN -- 조건이 불일치하는 경우
INSERT (A.EXAMPLE_NAME)
VALUES (EX.EXAMPLE_NAME);
USING 절의 서브쿼리 결과와 조인하여 사용함
반응형
'프로그래밍 > Database' 카테고리의 다른 글
Oracle_WHERE 1=1 (0) | 2023.08.29 |
---|---|
MySQL_JAVA DB 연결 (select, delete) (0) | 2023.03.14 |
MySQL_GROUP BY절 (0) | 2023.03.10 |
MySQL_N : M 관계 (0) | 2023.03.10 |
MySQL_MySQL FUNCTION (0) | 2023.03.10 |