1. MERGE
(MS-SQL 2008, Oracle 9i 에서 생김)
두 테이블간의 데이터를 합치는 작업이다.
단 하나의 트랜잭션에서 작업이 진행되어야 함.
Source Table과 Target 테이블의 데이터를 비교했을때
겹치는부분(빨간색)은 Update, Source Table 에만 있는 데이터는 INSERT
작업을 진행한다.
--MERGE
if OBJECT_ID('tempdb..#TargetTable') is not null
drop table #TargetTable
if OBJECT_ID('tempdb..#SourceTable') is not null
drop table #SourceTable
create table #SourceTable
(
a int identity
,b varchar(100)
)
create table #TargetTable
(
a int identity
,b varchar(100)
)
insert into #SourceTable(b) values('aaa'),('bbb'),('ccc'),('ddd'),('eee'),('fff')
insert into #TargetTable(b) values('111'),('222'),('333'),('444'),('555'),('666'),('777'),('888'),('999')
--MERGE 작업을 진행할 Target
MERGE INTO #TargetTable AS t
--기준이되는 데이터가 있는 Source Table 과 JOIN 을 한다.
USING #SourceTable AS s ON
s.a = t.a
--데이터가 겹칠때
WHEN MATCHED THEN
UPDATE SET t.b = s.b
--Source 테이블에만 데이터가있을때
WHEN NOT MATCHED THEN
INSERT (b) values( s.b);
select * from #TargetTable |
2. OUTPUT
A 테이블에 DML(update, insert, delete)작업이 일어나고
B 테이블에 같은 조건으로 Insert 를 할 수 있다.
단, 하나의 트랜잭션에서 작업이 진행되어야 한다.
Insert 일때는 inserted Object 가 생성된다.
Delete 일때는 deleted Object 가 생성된다.
Update 일때는 deleted Object와 inserted Object 가 둘다 생성된다.
이를 이용하여 B테이블에도 데이터를 입력할 수 있다.
--OUTPUT
if OBJECT_ID('tempdb..#1st') is not null
drop table #1st
if OBJECT_ID('tempdb..#2nd') is not null
drop table #2nd
create table #1st
(
a int identity
,b varchar(100)
)
create table #2nd
(
a int identity
,new_b varchar(100)
,old_b varchar(100)
)
insert into #1st(b)
OUTPUT inserted.b
into #2nd (new_b)
values('aaa'),('bbb'),('ccc'),('ddd'),('eee'),('fff')
select *
from #2nd
update #1st
set b = b + '111'
OUTPUT inserted.b, deleted.b
into #2nd (new_b,old_b)
select *
from #2nd
|