Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Probleme mit der MERGE-Anweisung von SQL Server

Jeder der vier Werte in #S entspricht dem einzelnen Zeilenwert Ihrer Zieltabelle (alle Werte in #S haben id =1 und name ='A' - also stimmen sie alle mit der einzelnen Zeile im Ziel überein), daher wird dieser Wert viermal aktualisiert - das ist der Fehler sagt, und es ist absolut richtig.

Was willst du hier eigentlich erreichen??

Möchten Sie die Adresse auf den ersten der Werte aus der Quelltabelle setzen? Verwenden Sie einen TOP 1 -Klausel in Ihrem Subselect:

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;

Möchten Sie die Adresse auf ein zufälliges Element der Werte aus der Quelltabelle festlegen? Verwenden Sie einen TOP 1 und ORDER BY NEWID() -Klausel in Ihrem Subselect:

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;

Wenn Sie vier Quellzeilen mit einer einzigen Zielzeile abgleichen, erhalten Sie nie ein brauchbares Ergebnis – Sie müssen wissen, was Sie wirklich wollen.

Markus