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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top