2009-10-27 6 views
8

두 SQL Server 2008 테이블간에 일부 데이터를 이동하려고합니다. 레코드가 Table1의 전자 메일과 함께 Table2에 있으면 Table1의 데이터로 해당 레코드를 업데이트하고 그렇지 않으면 새 레코드를 삽입하십시오.레코드가있는 경우 다른 업데이트 업데이트

표 1에는 여러 열이 있습니다. 이름, 성, 이메일 등등.

Table1의 전자 메일이 존재하는 경우 Table2를 업데이트하는 쿼리를 구성하는 방법이나 Table1의 전자 메일이 Table2의 전자 메일에없는 경우 새 행을 삽입하는 방법을 잘 모르겠습니다.

Google에서 몇 가지 검색을 시도했지만 대부분의 솔루션은 일부 저장 프로 시저를 만들어 작동하는 것 같습니다. 그래서 누군가 트릭을 수행 할 수있는 적합한 쿼리를 작성하는 방법을 알고 있는지 궁금한가요?

답변

9
MERGE 
INTO table2 t2 
USING table1 t1 
ON  t2.email = t1.email 
WHEN MATCHED THEN 
UPDATE 
SET  t2.col1 = t1.col1, 
     t2.col2 = t1.col2 
WHEN NOT MATCHED THEN 
INSERT (col1, col2) 
VALUES (t1.col1, t1.col2) 
20

내 생각에 MERGE은 원하는 것입니다.

+0

+1 좋은 솔루션입니다. –

+0

정확히 머지 (MERGE)가 설계된 기능입니다 (일부 분야에서는 INSERT/UPDATE 이상을 처리하더라도이 "UPSERT"라고합니다). –

1

Microsoft는 SQL 테이블간에 a tool to compare data을 릴리스했습니다. 이는 특정 상황에서 좋은 옵션 일 수 있습니다.

편집 : 누락되었거나 다른 행을 삽입/업데이트하는 스크립트를 생성합니다.

완벽을 기하기 위해 원하는 쿼리를 해킹하여 기존 table2 레코드를 업데이트하고 누락 된 쿼리를 전자 메일 주소를 기반으로 추가합니다.

아래의 'updating'및 'missing missing'쿼리는 원하는 것입니다.

BEGIN TRAN 

create table #table1 (id int, fname varchar(20), email varchar(20)) 
insert into #table1 values (1, 'name_1_updated', 'email_1') 
insert into #table1 values (3, 'name_3_updated', 'email_3') 
insert into #table1 values (100, 'name_100', 'email_100') 


create table #table2 (id int, fname varchar(20), email varchar(20)) 
insert into #table2 values (1, 'name_1', 'email_1') 
insert into #table2 values (2, 'name_2', 'email_2') 
insert into #table2 values (3, 'name_3', 'email_3') 
insert into #table2 values (4, 'name_4', 'email_4') 

print 'before update' 
select * from #table2 

print 'updating' 
update #table2 
set #table2.fname = t1.fname 
from #table1 t1 
where t1.email = #table2.email 

print 'insert missing' 
insert into #table2 
select * from #table1 
where #table1.email not in (select email from #table2 where email = #table1.email) 

print 'after update' 
select * from #table2 

drop table #table1 
drop table #table2 

ROLLBACK 
+0

안녕하세요, 위의 쿼리를 작성하는 시간을 보내 주셔서 감사합니다. 대단히 감사합니다 ... 나는 이것을 시도 할 것입니다. – doubleplusgood

+0

MERGE 명령은 SQL 2008에서만 지원되므로 pre SQL 2008을 사용하는 모든 사용자에게 해당됩니다. RTM 릴리스에서 가져온 명령입니다. 바보 같은 SQL 팀. – invert

관련 문제