Pierwszą (i najbardziej oczywistą) odpowiedzią jest oczyszczenie danych, aby nie było duplikatów. Wydaje się prawdopodobne, że podane przez Ciebie przykładowe dane są wynikiem błędu.
Co do merge
oświadczenie, jeśli dane są faktycznie zduplikowane, możesz po prostu użyć distinct
:
MERGE INTO maintable pr
USING (SELECT DISTINCT contract,
membertype,
address1,
city,
state,
zipcode,
countrycode
FROM incrementaltable pra
WHERE pra.membertype = 'Parent')
ON (pr.contract = pra.contract)
WHEN MATCHED THEN
UPDATE SET pr.address1 = pra.address1,
pr.city = pra.city,
pr.state = pra.sate,
pr.zipcode = pra.zipcode,
pr.countrycode = pra.countrycode
WHERE address1 IS NULL AND pr.membertype <> 'Parent'