Necesito encontrar filas duplicadas en una tabla de SQL Server. El problema es que los valores pueden ser NULL. Tengo el siguiente código que parece funcionar bien en la medida en que las celdas no sean NULL:

select s.ID, t.* 
from [Data] s
join (select Term1, Term2, Term3, Term4, count(*) as cnt
      from [Data]
      group by Term1, Term2, Term3, Term4
      having count(*) > 1) t on s.Term1 = t.Term1 
                             and s.Term2 = t.Term2 
                             and s.Term3 = t.Term3 
                             and s.Term4 = t.Term4

¿Cómo puedo adaptarlo para que pueda encontrar duplicados incluso si hay valores NULL, como

Term1    Term2    Term3    Term4
--------------------------------
hello    NULL     okay     NULL
hello    NULL     okay     NULL
1
Kelly o'Brian 15 oct. 2018 a las 21:51

2 respuestas

La mejor respuesta

Podría usar COUNT(*) OVER():

WITH cte AS (
  SELECT *, COUNT(*) OVER(PARTITION BY Term1, Term2, Term3, Term4) AS cnt
  FROM [Data]
)
SELECT *
FROM cte
WHERE cnt > 1
4
Lukasz Szozda 15 oct. 2018 a las 18:53

¿Está seguro de que necesita devolver ambas filas en el duplicado? Su consulta interna está bien para identificar filas duplicadas y puede agregar el recuento como una columna adicional. ¿Cuál es el beneficio de devolver cada fila?

0
FrugalShaun 15 oct. 2018 a las 20:55