2016-05-12 17 views
0

Ich habe zwei Tabellen:Update und einfügen, um eine Tabelle aus einer anderen

table1: (ID, Code, Name)
table2: (ID, Code, Name) mit gleichen Spalten

Ich möchte um Daten aus Tabelle1 in Tabelle2 einzufügen oder Spalten zu aktualisieren, falls diese in Tabelle2 vorhanden ist (Tabelle1.ID = Tabelle2.ID)

Wie ist die einfache Methode?

whitout MERGE

+0

Mögliches Duplikat von: http://stackoverflow.com/questions/1197733/does-sql-server-offer-anything-like-mysqls-on-duplicate-key-update –

+0

Sie führen Tabelle 1 in Tabelle 2 zusammen, aktualisieren Wo passen und einfügen wo nicht - https://msdn.microsoft.com/en-GB/library/bb510625.aspx – MightyRearranger

+0

Ich kann nicht verwenden Merge, weil meine Datenbank ist SQL Server 2005 –

Antwort

1
Merge table2 as target 
using table1 as source 
on 
target.id=source.id 
When matched 
Then 
update 
set target.id=source.id, 
    target.name=source.name 
When not matched by Target Then 
INSERT (id, name) VALUES (id, name); 

einige Probleme mit Merge-Anweisung Es gibt, so sollte es ich empfehlen

Weitere mit caution .. verwendet werden, da zwei getrennte DML-Anweisungen verschmelzen wie unten ..

insert into table2 
select * from table1 t1 where not exists (select 1 from table2 t2 where t2.id=t1.id) 

update t2 
set 
t2.id=t1.id, 
t2.name=t1.name 
from 
table1 t1 
join 
table2 t2 
on t1.id=t2.id 

Gründe durch Paul White hier in seinem ausführlichen erklärte answer ..

+0

Für eine bessere Leistung führen Sie 'update' zuerst,' insert' second. –

+0

Vielen Dank für den Vorschlag.Any offensichtliche Gründe ..oder Zeiger ..? – TheGameiswar

+0

ist es offensichtlich Grund. wenn du zuerst eingibst dann aktualisierst du auch frisch eingefügte Datensätze;) –

0

die ID-Spalte Unter der Annahme, ist einzigartig und sollte nicht festgelegt werden, es scheint, dass Sie es in zwei SQL-Anweisungen tun könnte.

/* UPDATE the rows in TABLE2 */ 
UPDATE TABLE2 
    SET NAME = (SELECT NAME FROM TABLE1 WHERE TABLE1.CODE = TABLE2.CODE) 
WHERE CODE IN (SELECT CODE FROM TABLE1) 

/* INSERT the rows that are missing */ 
INSERT INTO TABLE2 
    (CODE, NAME) 
    (
     SELECT CODE, NAME 
     FROM TABLE1 
     WHERE CODE NOT IN (SELECT CODE FROM TABLE2) 
    ) 
0
MERGE table2 t2 
USING table1 t1 
ON t1.ID = t2.ID 
WHEN MATCHED THEN 
    UPDATE 
    SET t2.Code = t1.Code, t2.Name = t1.Name 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ID, Name, Code) 
    VALUES (t1.ID, t1.Name, t1.Code); 
0

alle Zeilen erhalten, die in Tabelle 1 sind aber nicht in table2

insert into table2(id, code, name)(
SELECT table1.* 
FROM table1 
    LEFT JOIN table2 ON (table1.id = table2.id) 
WHERE table2.C IS NULL 
) 

Update table2

update table2 set name = (select name from table1 where table1.code = table2.code and table1.id = table2.id) 

Es könnte bei triggers auf Update lohnt ein Blick und ein, wenn Sie möchten, habe das manuell gemacht

-1

Hier schreibe ich ein Skript, das voll verwenden, wenn Sie Tabelle2 aus Tabelle1 aktualisieren möchten.

Update table2 set table2.code = table1.code, table2.name=table1.name from table1 where table2.id=table1.id 

Und wenn Sie einfügen möchten, dann verwenden Sie dieses Skript.

Wenn in Tabelle2 ID nicht automatisch erhöht wird. Sonst nicht den Wert der ID-Spalte in Tabelle2 einfügen.

Verwandte Themen