한번에 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 |
---|