블로그 이미지
프로그램을 가장 훌륭하게 작성하는 방법은 상태가 변경되는 오브젝트들과 수학적인 값을 나타내는 오브젝트들의 조합으로 표현하는 것이다. -Kent Beck 초초초보

카테고리

Programming (184)
ASP.NET (9)
Silverlight (2)
Javascript (20)
C# (8)
java (25)
SQL (14)
Oracle (3)
MyBatis (3)
기타 (52)
개발방법론 (1)
trouble shooting (2)
Linux (5)
스칼라 (5)
html (2)
grails & gradle (3)
Spring (2)
rabbitmq (1)
(3)
spark (0)
docker (3)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

MS-SQL 2008 MERGE, OUTPUT

SQL / 2011. 1. 9. 22:34

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


Posted by 초초초보
, |