Frage Wenn der Datensatz vorhanden ist, aktualisieren Sie den anderen Eintrag


Ich versuche, 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.

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

Ich bin mir nicht sicher, wie die Abfrage zum Aktualisieren von Tabelle2 strukturiert werden soll, wenn die E-Mail aus Tabelle1 existiert oder eine neue Zeile eingefügt wird, wenn in Tabelle2 keine E-Mail aus Tabelle1 existiert.

Ich habe versucht, ein paar Suchvorgänge bei Google durchzuführen, aber die meisten Lösungen scheinen zu funktionieren, indem ich eine gespeicherte Prozedur erstelle. Also habe ich mich gefragt, ob irgendjemand wissen könnte, wie man eine passende Abfrage erstellt, die den Trick machen könnte?


8
2017-10-27 11:58


Ursprung


Antworten:


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)

9
2017-10-27 23:02



Ich denke VERSCHMELZEN ist was du willst.


20
2017-10-27 12:04



Microsoft veröffentlicht ein Werkzeug zum Vergleichen von Daten zwischen SQL-Tabellen könnte dies in bestimmten Situationen eine gute Option 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 fehlend" 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

1
2017-10-27 12:08