J'essaie d'insérer des enregistrements dans la base de données MySQL à partir d'un serveur MS SQL en utilisant le "OPENQUERY" mais ce que j'essaie de faire est d'ignorer les messages de clés en double. Donc, lorsque la requête s'exécute en double, ignorez-la et continuez.
Quelles idées puis-je faire pour ignorer les doublons?
Voici ce que je fais:
Le problème est que lors de la jonction du tableau A au tableau B, je trouve parfois 2+ enregistrements dans le tableau B correspondant aux critères que je recherche, ce qui entraîne la valeur A.record_id à 2+ fois dans mon ensemble de données avant de l'insérer dans le tableau A ce qui cause le problème. Remarque Je peux utiliser la fonction d'agrégation pour éliminer les enregistrements.
Je ne pense pas qu'il existe une option spécifique. Mais c'est assez simple à faire:
insert into oldtable(. . .)
select . . .
from newtable
where not exists (select 1 from oldtable where oldtable.id = newtable.id)
S'il existe plusieurs jeux de clés uniques, vous pouvez ajouter des instructions not exists
Supplémentaires.
ÉDITER:
Pour le problème révisé:
insert into oldtable(. . .)
select . . .
from (select nt.*, row_number() over (partition by id order by (select null)) as seqnum
from newtable nt
) nt
where seqnum = 1 and
not exists (select 1 from oldtable where oldtable.id = nt.id);
La fonction row_number()
attribue un numéro séquentiel à chaque ligne d'un groupe de lignes. Le groupe est défini par l'instruction partition by
. Les nombres commencent à 1 et augmentent à partir de là. La clause order by
Indique que vous ne vous souciez pas de la commande. Exactement une ligne avec chaque id aura une valeur de 1. Les lignes en double auront une valeur supérieure à un. Le seqnum = 1
Choisit exactement une ligne par identifiant.
Si vous êtes sur SQL Server 2008+, vous pouvez utiliser MERGE
pour faire un INSERT
si la ligne n'existe pas, ou un UPDATE
.
Exemple:
MERGE
INTO dataValue dv
USING tmp_holding_DataValue t
ON t.dateStamp = dv.dateStamp
AND t.itemId = dv.itemId
WHEN NOT MATCHED THEN
INSERT (dateStamp, itemId, value)
VALUES (dateStamp, itemId, value)