Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Problemas com a instrução MERGE do SQL Server


Qualquer um dos quatro valores em #S corresponderá ao valor de linha única da sua tabela de destino (todos os valores em #S têm id =1 e name ='A' - portanto, todos correspondem à única linha no destino), portanto, esse valor será atualizado quatro vezes - é esse o erro diz, e está absolutamente certo.

O que você realmente quer alcançar aqui??

Deseja definir o endereço para o primeiro dos valores da tabela de origem? Use um TOP 1 cláusula em sua subseleção:
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;

Deseja definir o endereço como um elemento aleatório dos valores da tabela de origem? Use um TOP 1 e ORDER BY NEWID() cláusula em sua subseleção:
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;

Se você combinar quatro linhas de origem com uma única linha de destino, nunca obterá um resultado útil - você precisa saber o que realmente deseja.

Marco