Registros duplicates de SQL Server

Hola, he realizado la siguiente consulta a continuación:

UPDATE [dbo].[TestData] SET Duplicate = 'Duplicate within' WHERE exists (SELECT telephone, COUNT(telephone) FROM [dbo].[TestData] GROUP BY telephone HAVING (COUNT (telephone)>1)) 

En esa tabla, en realidad hay 9 loggings telefónicos duplicates.

La consulta está sellando toda la columna duplicada como 'Duplicar dentro' en lugar de los 9 loggings.

La próxima consulta siguiente también he desarrollado, que eliminará los 18 loggings duplicates a 9.

 UPDATE [dbo].[TestData] SET Duplicate = 'NO' WHERE ID IN (SELECT MIN(ID) FROM [dbo].[TestData] GROUP BY telephone) 

Esta consulta no está funcionando y tampoco podría nadie guiarme sobre dónde me estoy equivocando.

Puede hacer esto usando el lugar donde existe, pero es más fácil escribir / leer de esta manera y la diferencia de performance es muy probablemente mínima.

 update TestData set Duplicate = 'Duplicate within' where Telephone in ( select Telephone from TestData group by Telephone having count(*) > 1 ) 

Para dejar el primer logging con cada número de teléfono solo y marcar solo los loggings subsiguientes con el mismo número de teléfono, use un cte de la siguiente manera:

 ;with NumbenetworkingDupes as ( select Telephone, Duplicate, row_number() over (partition by Telephone order by Telephone) seq from TestData ) update NumbenetworkingDupes set Duplicate = 'Duplicate within' where seq > 1 

El problema es que la consulta EXISTS no se filtra. Necesita ser filtrado por cada número de teléfono:

 UPDATE [dbo].[TestData] SET Duplicate = 'Duplicate within' FROM [TestData] t WHERE EXISTS ( SELECT telephone, COUNT(telephone) FROM [dbo].[TestData] WHERE telephone = t.telephone GROUP BY telephone HAVING (COUNT (telephone)>1)) ) 

Si solo quiere encontrar los duplicates, necesita mirar uno de los dos loggings como lo demuestra la selección secundaria a continuación. El EXISTS realmente te hará actualizar ambas filas ya que eso es lo que estás probando.

  UPDATE [dbo].[TestData] SET Duplicate = 'Duplicate within' WHERE Id IN (SELECT MAX(Id) FROM [dbo].[TestData] GROUP BY telephone HAVING (COUNT (telephone)>1))