Problèmes avec SQL Server instruction MERGE
Table Source
Id, Name, Address
1 A #202
1 A #203
1 A #204
2 A #202
Table Cible
Id, Name, Address
1 A NULL
Après Fusion
Id, Name, Address
1 A #202
2 A #202
Je suis en utilisant ce SQL
create table #S (ID int, Name varchar(25) NULL, Address varchar(25) NULL)
create table #T (ID int, Name varchar(25) NULL, Address varchar(25) NULL)
INSERT #S values(1, 'A', '#202')
INSERT #S values(1, 'A', '#203')
INSERT #S values(1, 'A', '#203')
INSERT #S values(1, 'A', '#204')
INSERT #T values(1, 'A', NULL)
MERGE #T USING
(
Select id, name, address
from #S
) AS S(id,name,address)
on #T.id=S.id and #T.Name=S.Name
when not matched THEN
INSERT values(S.id,S.Name, S.Address)
when matched then
update set Address = S.Address;
GO
Select * from #T
GO
Select * from #S
GO
Ce qui provoque une erreur
Msg 8672, Niveau 16, État 1, Ligne 18
L'instruction MERGE tenté de mettre à JOUR ou SUPPRIMER la même ligne plus d'une fois. Cela se produit lorsqu'une ligne cible correspond à plus d'une ligne source. Une instruction MERGE ne peut pas mettre à JOUR/SUPPRIMER la même ligne de la table cible à plusieurs reprises. Affiner la clause d'assurer une ligne cible correspond au plus une ligne source, ou de l'utilisation de la clause GROUP BY pour regrouper les lignes source.
Je veux mettre à jour la ligne dans Une avec la valeur de l'Adresse de l'un des trois valeurs correspondantes. Comment faire cela?
OriginalL'auteur R.D | 2009-09-16
Vous devez vous connecter pour publier un commentaire.
L'une des quatre valeurs dans
#S
correspondent à votre table cible unique de la valeur de ligne (toutes les valeurs dans #S id = 1 et nom = " A " - de sorte qu'ils correspondent tous à la même ligne de la cible), donc cette valeur va être mis à jour quatre fois - c'est ce que l'erreur dit, et c'est absolument droit.Qu'est-ce que vous voulez vraiment réaliser ici??
Voulez-vous de définir l'Adresse de la première des valeurs de la table source? Utiliser un
TOP 1
clause dans votre sous-sélection:Voulez-vous de définir l'Adresse d'un élément aléatoire des valeurs de la table source? Utiliser un
TOP 1
etORDER BY NEWID()
clause dans votre sous-sélection:Si vous correspondez à quatre lignes source vers une cible unique ligne, vous ne serez jamais obtenir un résultat utile à l' - vous besoin de savoir ce que vous voulez vraiment.
Marc
mais comment voulez-vous déterminer qui d'entre eux à utiliser?
J'ai utilisé la fonction Row_Number est à la fois la source et la cible(point de vue) . Ensuite, les critères de correspondance supplémentaires incluses condition, si rownumbers sont égales à ( cible.adresse isnull ou (t.adresse = s.adresse))
j'ai le même problème, mais avec une exigence supplémentaire. Je veux mettre à jour la dernière valeur provient de la source et aussi ma table source inclure un autre champ de rue que les valeurs seront s1,s2,s3,s4. et je tiens à raisin à ce résultat après la mise à jour est terminé, s1, s2, s3, s4 utilisation de ces données dans une autre mise à jour stament. Une Idée ?
Solution sympa, il a travaillé pour moi 🙂
OriginalL'auteur marc_s
Supprimer la dupicate à l'aide de
pour fusionner vous ne pouvez pas avoir des doublons, donc vous devez toujours ramasser la dernière
OriginalL'auteur Richard Varghese