Elk van de vier waarden in #S
komt overeen met de enkele rijwaarde van uw doeltabel (alle waarden in #S hebben id =1 en naam ='A' - dus ze komen allemaal overeen met de enkele rij in het doel), dus deze waarde wordt vier keer bijgewerkt - dat is wat de fout is zegt, en het is volkomen juist.
Wat wil je hier echt bereiken??
Wilt u het adres instellen op de eerste van de waarden uit de brontabel? Gebruik een TOP 1
clausule in uw subselectie:
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;
Wilt u het adres instellen op een willekeurig element van de waarden uit de brontabel? Gebruik een TOP 1
en ORDER BY NEWID()
clausule in uw subselectie:
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;
Als u vier bronrijen koppelt aan één doelrij, krijgt u nooit een bruikbaar resultaat - u moet weten wat u echt wilt.
Marc