sql >> Databasteknik >  >> RDS >> Sqlserver

Problem med SQL Server MERGE-satsen

Något av de fyra värdena i #S kommer att matcha din måltabells enradsvärde (alla värden i #S har id =1 och namn ='A' - så de matchar alla den enstaka raden i målet), så detta värde kommer att uppdateras fyra gånger - det är det som felet säger, och det är helt rätt.

Vad är det du egentligen vill uppnå här??

Vill du ställa in adressen till det första av värdena från källtabellen? Använd en TOP 1 klausul i ditt underval:

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;

Vill du ställa in adressen till ett slumpmässigt element av värdena från källtabellen? Använd en TOP 1 och ORDER BY NEWID() klausul i ditt underval:

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;

Om du matchar fyra källrader till en enda målrad får du aldrig ett användbart resultat - du måste veta vad du verkligen vill ha.

Marc



  1. Hur förhindrar man att mySQL återställer automatiskt inkrementvärde?

  2. Reflektion i PLSQL?

  3. Group_concat MySQL-funktionens motsvarighet i Oracle

  4. sails.js Blueprint-fråga efter relationer