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.

War es hilfreich?

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

Von SQL Server können Sie a festlegen Einzigartiger Schlüssel Index in der Tabelle für (Spalten, die eindeutig sein müssen)

From sql server right click on the table design select Indexes/Keys

Select column(s) that will be not duplicate , then type Unique Key

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top