2009-10-27 19 views
8

Sto provando a spostare alcuni dati tra due tabelle di SQL Server 2008. Se il record esiste in Table2 con l'e-mail di Table1, aggiornare quel record con i dati di Table1, altrimenti inserire un nuovo record.Se la registrazione esiste, aggiorna anche Inserisci

Nella tabella 1 ho un numero di colonne; nome, cognome, email e così via.

Non sono abbastanza sicuro su come strutturare la query per aggiornare Table2 se l'e-mail da Table1 esiste o inserire una nuova riga se l'e-mail da Table1 non esiste in Table2.

Ho provato a fare alcune ricerche su Google ma la maggior parte delle soluzioni sembra funzionare creando alcune stored procedure. Quindi mi chiedevo se qualcuno potesse sapere come costruire una query adatta che potrebbe fare il trucco?

risposta

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

Penso che MERGE sia quello che vuoi.

+0

+1 bella soluzione. –

+0

Questo è esattamente ciò che è stato progettato per MERGE ... (alcune discipline chiamano questo "UPSERT" anche se gestisce più di INSERT/UPDATE). –

1

Microsoft ha rilasciato a tool to compare data tra le tabelle SQL, questa potrebbe essere una buona opzione in determinate situazioni.

Modifica: dimenticato di menzionare, genera anche uno script per inserire/aggiornare file mancanti o differenti.

Per completezza, ho violato questa query che fa ciò che vuoi, aggiorna i record esistenti di table2 e aggiunge quelli mancanti, in base all'indirizzo email.

Le domande di "aggiornamento" e "inserimento mancante" di seguito sono quelle che si desidera.

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

Ehi amico, grazie per aver dedicato del tempo a scrivere la query precedente. Molto apprezzato ... farò un tentativo. – doubleplusgood

+0

Questo vale per chiunque usi pre SQL 2008, poiché il comando MERGE è supportato solo in SQL 2008. Lo hanno estratto dalla versione RTM. Squallido team SQL. – invert

Problemi correlati