Se il record esiste, aggiorna altro inserto
-
06-07-2019 - |
Domanda
Sto cercando di spostare alcuni dati tra due tabelle di SQL Server 2008. Se il record esiste in Table2 con l'e-mail da Table1, aggiornalo con i dati da Table1, altrimenti inserisci un nuovo record.
Nella Tabella 1 ho un numero di colonne; nome, cognome, email e così via.
Non sono sicuro di 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 creare una query adatta che potesse fare il trucco?
Soluzione
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)
Altri suggerimenti
Penso che MERGE è quello che vuoi.
Microsoft ha rilasciato uno strumento per confrontare i dati tra tabelle SQL, questa potrebbe essere una buona opzione in determinate situazioni.
Modifica: dimenticato di menzionare, genera anche uno script per inserire / aggiornare righe mancanti o diverse.
Per completezza, ho hackerato questa query che fa quello che vuoi, aggiorna i record table2 esistenti e aggiunge quelli mancanti, in base all'indirizzo e-mail.
Le query 'update' e 'insert missing' di seguito sono quelle che desideri.
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