I have the following query that returns duplicates that i am running on sql server. So I need to write a query that will update second instance of the email address based on the select query that retrieves dulicates to for example imports@rohnis.com to imports@rohnis.com.duplicate. If it is info@eps.ws then info@eps.ws.duplicate. So basically postfix the email address with the word duplicate. It could be any email address
Query to search duplicates
SELECT ta.Id
      ,ta.Email
      ,ta.ClientCompanyId
FROM [IdentityDB_CSR].[dbo].[User] ta
WHERE (SELECT COUNT(*)
       FROM [IdentityDB_CSR].[dbo].[User] ta2
       WHERE ta.Email=ta2.Email
       AND ta.ClientCompanyId=ta2.ClientCompanyId)>1
Output of the query
Query to update
update [IdentityDB_CSR].[dbo].[User] set Email = 'info@eps.ws.duplicate' where id = 87183
Advertisement
Answer
You could use an updatable cte:
with cte as (
    select
        Email,
        row_number() over(partition by Email, ClientCompanyId order by id desc) rn
    from [IdentityDB_CSR].[dbo].[User]
)
update cte 
set Email = Email + '.duplicate'
where rn > 1
This identifies duplicates as record that share the same Email and ClientCompanyId. The record that has the greatest id is left untouched, while for others we add '.duplicate at the end of the Email.
