Dowolna z czterech wartości w #S
dopasuje wartość pojedynczego wiersza w tabeli docelowej (wszystkie wartości w #S mają id =1 i nazwę ='A' - więc wszystkie pasują do pojedynczego wiersza w celu), więc ta wartość zostanie zaktualizowana cztery razy - to jest błąd mówi i jest to absolutnie słuszne.
Co tak naprawdę chcesz tutaj osiągnąć?
Czy chcesz ustawić adres na pierwszą z wartości z tabeli źródłowej? Użyj TOP 1
klauzula w podselekcji:
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;
Czy chcesz ustawić adres na losowy element wartości z tabeli źródłowej? Użyj TOP 1
i ORDER BY NEWID()
klauzula w podselekcji:
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;
Jeśli dopasujesz cztery wiersze źródłowe do jednego wiersza docelowego, nigdy nie uzyskasz użytecznego wyniku — musisz wiedzieć, czego naprawdę chcesz.
Marek