2009-10-27 9 views
8

Ich versuche, einige Daten zwischen zwei SQL Server 2008-Tabellen zu verschieben. Wenn der Datensatz in Table2 mit der E-Mail aus Table1 vorhanden ist, aktualisieren Sie diesen Datensatz mit den Daten aus Table1, andernfalls fügen Sie einen neuen Datensatz ein.Wenn Datensatz vorhanden ist, aktualisieren Sie andernfalls Einfügen

In Tabelle1 habe ich eine Anzahl von Spalten; Vorname, Nachname, E-Mail und so weiter.

Ich bin mir nicht sicher, wie die Abfrage zu aktualisieren, um Tabelle2 zu aktualisieren, wenn die E-Mail aus Tabelle1 vorhanden ist oder eine neue Zeile einfügen, wenn E-Mail aus Tabelle1 nicht in Tabelle2 vorhanden ist.

Ich habe versucht, ein paar Suchen auf Google, aber die meisten Lösungen scheinen zu arbeiten, indem Sie eine gespeicherte Prozedur erstellen. Also habe ich mich gefragt, ob irgendjemand wissen könnte, wie man eine passende Abfrage erstellt, die den Trick machen könnte?

Antwort

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

Ich denke, MERGE ist was du willst.

+0

+1 Nizza Lösung. –

+0

Genau dafür wurde MERGE entwickelt ... (einige Disziplinen nennen das "UPSERT", obwohl es mehr als nur INSERT/UPDATE behandelt). –

1

Microsoft freigegeben a tool to compare data zwischen SQL-Tabellen, dies könnte eine gute Option in bestimmten Situationen sein.

Bearbeiten: Vergessen zu erwähnen, es generiert auch ein Skript zum Einfügen/Aktualisieren von fehlenden oder anderen Zeilen.

Der Vollständigkeit halber habe ich diese Abfrage gehackt, die tut, was Sie wollen, aktualisiert vorhandene Tabelle2 Datensätze und fügt diejenigen hinzu, die fehlen, basierend auf der E-Mail-Adresse.

Die Abfragen 'Aktualisieren' und 'Einfügen fehlt' sind die, die Sie möchten.

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

Hey Mann, danke, dass du dir die Zeit genommen hast, die obige Frage aufzuschreiben. Sehr geschätzt ... Ich werde es versuchen. – doubleplusgood

+0

Dies ist für jeden, der pre SQL 2008 verwendet, da der MERGE-Befehl nur in SQL 2008 unterstützt wird. Sie haben ihn aus der RTM-Version übernommen. Dummes SQL-Team. – invert