Éviter les doublons dans INSERT INTO SELECT query dans SQL Server

j'ai les deux tableaux suivants:

Table1
----------
ID   Name
1    A
2    B
3    C

Table2
----------
ID   Name
1    Z

je dois insérer les données de Table1 à Table2 . Je peux utiliser la syntaxe suivante:

INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1

cependant, dans mon cas, les doublons D'IDs peuvent exister dans Table2 (dans mon cas, c'est juste 1 ") et je ne veux pas copier que de nouveau car cela lancerait une erreur.

je peux écrire quelque chose comme ceci:

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

y a-t-il une meilleure façon de le faire sans utiliser IF - ELSE ? Je veux éviter deux INSERT INTO-SELECT déclarations basées sur une certaine condition.

81
demandé sur Pang 2010-03-25 08:02:23

6 réponses

utilisant 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)

utilisant 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)

utilisant 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

des trois options, la LEFT JOIN/IS NULL est moins efficace. Voir ce lien pour plus de détails .

159
répondu OMG Ponies 2010-03-25 05:07:34

Dans MySQL, vous pouvez faire ceci:

INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1

est-ce que SQL Server a quelque chose de similaire?

26
répondu Duncan 2010-03-25 06:54:22

je viens d'avoir un problème similaire, le mot-clé DISTINCT fonctionne magie:

INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
6
répondu Hunter Bingham 2016-07-15 22:27:07

utilisant ignore Duplicates sur l'index unique comme suggéré par IanC ici était ma solution pour une question similaire, créant l'index avec L'Option WITH IGNORE_DUP_KEY

In backward compatible syntax
, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

Réf.: index_option

3
répondu Tazz602 2017-05-23 10:31:26

de SQL Server vous pouvez définir un clé Unique index sur la table pour (colonnes qui doit être unique)

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

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

3
répondu M. Salah 2016-07-31 08:09:14

un peu hors sujet, mais si vous voulez migrer les données vers une nouvelle table, et les duplicata possibles sont dans la table originale , et la colonne éventuellement dupliquée n'est pas un id, un GROUP BY fera:

INSERT INTO TABLE_2
(name)
  SELECT t1.name
  FROM TABLE_1 t1
  GROUP BY t1.name
0
répondu FullStackFool 2018-01-30 15:43:17