Vermeiden Sie Duplikate im Einfügen in SQL -Server aus SELECT -Abfrage in SQL Server
-
22-09-2019 - |
Frage
Ich habe die folgenden zwei Tabellen:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Ich muss Daten aus einfügen Table1
zu Table2
. Ich kann die folgende Syntax verwenden:
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
In meinem Fall könnten jedoch doppelte IDs in existieren Table2
(In meinem Fall ist es einfach "1
") Und ich möchte das nicht noch einmal kopieren, da dies einen Fehler aufwirft.
Ich kann so etwas schreiben:
IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1
Gibt es eine bessere Möglichkeit, dies zu tun, ohne zu verwenden? IF - ELSE
? Ich möchte zwei vermeiden INSERT INTO-SELECT
Aussagen basierend auf einer Bedingung.
Lösung
Verwendung NOT EXISTS
:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
WHERE NOT EXISTS(SELECT id
FROM TABLE_2 t2
WHERE t2.id = t1.id)
Verwendung NOT IN
:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
WHERE t1.id NOT IN (SELECT id
FROM TABLE_2)
Verwendung LEFT JOIN/IS NULL
:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.id = t1.id
WHERE t2.id IS NULL
Der drei Optionen die LEFT JOIN/IS NULL
ist weniger effizient. Sehen Dieser Link für weitere Details.
Andere Tipps
In MySQL können Sie das tun:
INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1
Hat SQL Server etwas Ähnliches?
Ich hatte gerade ein ähnliches Problem, das bestimmte Schlüsselwort funktioniert Magie:
INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
Verwendung ignore Duplicates
Auf dem eindeutigen Index Wie von IANC hier vorgeschlagen war meine Lösung für ein ähnliches Problem und erstellte den Index mit der Option WITH IGNORE_DUP_KEY
In backward compatible syntax
, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.
Ref .: INDEX_OPTION
Ich hatte in letzter Zeit das gleiche Problem ...
Hier hat, was für mich in Frau SQL Server 2017 funktioniert hat ...
Der Primärschlüssel sollte in Tabelle 2 auf die ID eingestellt werden ...
Die Spalten und Spalteneigenschaften sollten natürlich zwischen beiden Tabellen gleich sein. Dies funktioniert das erste Mal, dass Sie das folgende Skript ausführen. Die doppelte ID in Tabelle 1 fügt nicht ein ...
Wenn Sie es beim zweiten Mal ausführen, erhalten Sie eine
Verstoß gegen den Fehler der Primärschlüsselbeschränkung
Dies ist der Code:
Insert into Table_2
Select distinct *
from Table_1
where table_1.ID >1
Ein wenig aus dem Thema, aber wenn Sie die Daten in eine neue Tabelle migrieren möchten und die möglichen Duplikate in der sind Original Tabelle, und die Spalte möglicherweise dupliziert ist keine ID, a GROUP BY
Wird besorgt:
INSERT INTO TABLE_2
(name)
SELECT t1.name
FROM TABLE_1 t1
GROUP BY t1.name
Eine einfache DELETE
Vor dem INSERT
würde genügen:
DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
Umschalten Table1
zum Table2
Abhängig von welcher Tabelle Id
und name
Kombination möchten Sie bewahren.