Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Problemi con l'istruzione MERGE di SQL Server

Uno qualsiasi dei quattro valori in #S corrisponderà al valore della singola riga della tabella di destinazione (tutti i valori in #S hanno id =1 e name ='A' - quindi corrispondono tutti alla singola riga nella destinazione), quindi questo valore verrà aggiornato quattro volte - ecco qual è l'errore dice, ed è assolutamente giusto.

Cosa vuoi davvero ottenere qui??

Vuoi impostare l'indirizzo sul primo dei valori della tabella di origine? Usa un TOP 1 clausola nella tua sottoselezione:

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;

Vuoi impostare l'indirizzo su un elemento casuale dei valori dalla tabella di origine? Usa un TOP 1 e ORDER BY NEWID() clausola nella tua sottoselezione:

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 abbini quattro righe di origine a una singola riga di destinazione, non otterrai mai un risultato utile:devi sapere cosa vuoi veramente.

Marco