Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Problemy z instrukcją SQL Server MERGE

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. połącz dwie identyczne struktury tabel z różnymi danymi

  2. Wykonaj pętlę while w SQL Server 2008

  3. Różnica między podzapytaniem a skorelowanym podzapytaniem

  4. SQL Server — co się dzieje po zaktualizowaniu wiersza w tabeli?

  5. Weryfikacja połączenia 64-bitowego ColdFusion 10/Windowns 7 Pro nie powiodła się dla źródła danych