2009-10-27 18 views
8

Próbuję przenieść niektóre dane między dwoma tabelami programu SQL Server 2008. Jeśli rekord istnieje w tabeli 2 z adresem e-mail z tabeli 1, zaktualizuj ten rekord danymi z tabeli 1, w przeciwnym razie wstaw nowy rekord.Jeśli istnieje rekord, aktualizacja Inaczej wstaw

W tabeli 1 Mam liczbę kolumn; imię, nazwisko, adres e-mail i tak dalej.

Nie jestem do końca pewien, jak sformatować zapytanie, aby zaktualizować tabelę 2, jeśli wiadomość e-mail z tabeli 1 istnieje, lub wstawić nowy wiersz, jeśli wiadomości e-mail z tabeli 1 nie istnieją w tabeli 2.

Próbowałem wykonać kilka wyszukiwań w Google, ale większość rozwiązań wydaje się działać, tworząc pewną procedurę przechowywaną. Zastanawiałem się więc, czy ktoś może wiedzieć, jak zbudować odpowiednie zapytanie, które może wystarczyć?

Odpowiedz

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

Myślę, że MERGE jest tym, czego potrzebujesz.

+0

+1 Nicea rozwiązanie. –

+0

To jest dokładnie to, co MERGE zaprojektowano dla ... (niektóre dziedziny nazywają to "UPSERT", nawet jeśli obsługuje więcej niż tylko WSTAW/AKTUALIZACJA). –

1

Firma Microsoft wydała a tool to compare data między tabelami SQL, co może być dobrym rozwiązaniem w niektórych sytuacjach.

Edycja: zapomniałem wspomnieć, to również generuje skrypt do wstawiania/aktualizowania brakujących lub różnych wierszy.

Dla kompletności zhakowałem to zapytanie, które robi to, co chcesz, aktualizuje istniejące rekordy table2 i dodaje te, których brakuje, na podstawie adresu e-mail.

Poniższe zapytania "aktualizuj" i "wstawiaj brakujące" są tymi, które chcesz.

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

Hej człowieku, dziękuję za poświęcenie czasu na napisanie powyższego zapytania. Bardzo doceniane ... spróbuję. – doubleplusgood

+0

To jeśli dla każdego, kto używa pre SQL 2008, ponieważ polecenie MERGE jest obsługiwane tylko w SQL 2008. Wyciągnęli go z wydania RTM. Głupi zespół SQL. – invert