É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.
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 .
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?
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
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
de SQL Server vous pouvez définir un clé Unique index sur la table pour (colonnes qui doit être unique)
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