I ont les deux tableaux suivants:éviter les doublons dans la requête INSERT INTO SELECT dans SQL Server
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Je dois d'insérer des 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 ID en double peuvent exister dans Table2
(dans mon cas, il est juste « 1
») et je ne veux pas copier ce nouveau car cela lancer 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 at-il une meilleure façon de le faire sans utiliser IF - ELSE
? Je veux éviter deux INSERT INTO-SELECT
instructions basées sur certaines conditions.
Ju Pour une clarification sur la version NOT EXISTS, vous aurez besoin d'un indice WITH (HOLDLOCK) ou aucun verrou ne sera pris (car il n'y a pas de lignes à verrouiller!) afin qu'un autre thread puisse insérer la ligne sous vous. – IDisposable
Intéressant, parce que j'ai toujours cru que je devais être plus rapide que les sous-sélections. Peut-être est-ce uniquement pour les jointures droites et non pour les jointures à gauche. – Duncan
Duncan, la jonction est souvent plus rapide que la sous-sélection lorsqu'il s'agit de sous-requêtes corrélées. Si vous avez la sous-requête dans la liste de sélection, une jointure sera souvent plus rapide. – HLGEM