sql >> Base de Datos >  >> RDS >> Sqlserver

Problemas con la instrucción MERGE de SQL Server

Cualquiera de los cuatro valores en #S coincidirá con el valor de fila única de su tabla de destino (todos los valores en #S tienen id =1 y nombre ='A', por lo que todos coinciden con la fila única en el objetivo), por lo tanto, este valor se actualizará cuatro veces - ese es el error dice, y tiene toda la razón.

¿Qué es lo que realmente quieres lograr aquí?

¿Desea establecer la dirección en el primero de los valores de la tabla de origen? Usa un TOP 1 cláusula en su subselección:

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;

¿Desea establecer la dirección en un elemento aleatorio de los valores de la tabla de origen? Usa un TOP 1 y ORDER BY NEWID() cláusula en su subselección:

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 hace coincidir cuatro filas de origen con una sola fila de destino, nunca obtendrá un resultado útil:necesita saber lo que realmente quiere.

Marc