Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Problèmes avec l'instruction SQL Server MERGE

L'une des quatre valeurs de #S correspondra à la valeur de ligne unique de votre table cible (toutes les valeurs dans #S ont id =1 et name ='A' - donc elles correspondent toutes à la ligne unique dans la cible), donc cette valeur sera mise à jour quatre fois - c'est ce que l'erreur dit, et c'est tout à fait vrai.

Qu'est-ce que vous voulez vraiment réaliser ici ?

Voulez-vous définir l'adresse sur la première des valeurs de la table source ? Utilisez un TOP 1 clause dans votre sous-sélection :

MERGE #T 
USING (SELECT TOP 1 id, name, address FROM #S) AS S
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;

Voulez-vous définir l'adresse sur un élément aléatoire des valeurs de la table source ? Utilisez un TOP 1 et ORDER BY NEWID() clause dans votre sous-sélection :

MERGE #T 
USING (SELECT TOP 1 id, name, address FROM #S ORDER BY NEWID()) AS S
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;

Si vous faites correspondre quatre lignes source à une seule ligne cible, vous n'obtiendrez jamais un résultat utile - vous devez savoir ce que vous voulez vraiment.

Marc