한번에 UPDATE 와 INSERT 를 구분하여 실행

테이블을 갱신할때, 해당레코드가 있으면, UPDATE, 없으면 INSERT를 실행해야 할때가 있다.

소스코드에서 IF을 사용해서 존재체크를 하고, 처리구분을 할 필요성이 있다.

 

SQLServer 2008부터 Merge를 사용하면 IF를 사용하지 않고, 처리구분이 가능하다.

 

MERGE 투입(INSERT), 갱신(UPDATE), 삭제(DELETE) 의 데이터가 되는 테이블과 뷰를 지정
USING 대상테이터와 결합되는 데이터소스를 지정
ON 대상데이터와 데이터소스의 일치여부가 판단하는 결합조건을 지정
WHEN WHEN MATCHED
WHEN NOT MATCHED BY TARGET
WHEN NOT MATCHED BY SOURCE

ON의 결과, WHEN을 지정한 추가의 검색조건의 결과에 따라서 실행을 지정
OUTPUT 투입(INSERT), 갱신(UPDATE), 삭제(DELETE) 되는 데이터의 레코드별도 반환

 

한개의 테이블을 MERGE

UPDATE의 예

CREATE TABLE test_table( no INT, name VARCHAR(20), age INT )
INSERT INTO test_table VALUES( 10,'jkim01',40)

MERGE INTO test_table AS A
    USING (SELECT 10 AS no,'jkim03' AS name, 30 AS age ) AS B
    ON ( A.no = B.no )
    WHEN MATCHED THEN
        UPDATE SET
             name = B.name ,age = B.age
    WHEN NOT MATCHED THEN
        INSERT (no,name,age)
        VALUES (B.no,B.name,B.age)
;
SELECT no, name, age FROM test_table ORDER BY no
DROP TABLE test_table

// 결과
//no    name     age
//10    jkim03   30

검증용으로 투입했던 데이터가 「jkim03」으로 갱신되었습니다.

ON이하의 「A.no = B.no」의 조건이 일치했으므로, UPDATE(갱신) 되었습니다.

INSERT 예

CREATE TABLE test_table( no INT, name VARCHAR(20), age INT )
INSERT INTO test_table VALUES( 10,'jkim01',40)

MERGE INTO test_table AS A
    USING (SELECT 20 AS no,'jkim02' AS name, 40 AS age ) AS B
    ON ( A.no = B.no )
    WHEN MATCHED THEN
        UPDATE SET
             name = B.name ,age = B.age
    WHEN NOT MATCHED THEN
        INSERT (no,name,age)
        VALUES (B.no,B.name,B.age)
;
SELECT no, name, age FROM test_table ORDER BY no
DROP TABLE test_table

//실행결과
no    name    age
10    jkim03  30
20    jkim02  40

ON이하의 「A.no = B.no」의 조건이 일치하지 않았으므로, INSERT(투입) 되었습니다.

'SQL Server' 카테고리의 다른 글

컴럼(Column) 의 추가(add) / 변경(modify) / 삭제(delete)  (0) 2022.06.14

+ Recent posts