Entonces quiero hacer algo como este código sql a continuación:
select s.id, s.name,s.city
from stuff s
group by s.name having count(where city and name are identical) > 1
Para producir lo siguiente, (pero ignore dónde solo el nombre o solo la ciudad coinciden, tiene que estar en ambas columnas):
id name city
904834 jim London
904835 jim London
90145 Fred Paris
90132 Fred Paris
90133 Fred Paris
sql
sql-server
sql-server-2008
duplicates
NimChimpsky
fuente
fuente

nameocitycontienennull, no se informarán en la consulta externa, pero se compararán en la consulta interna.nullentonces (a menos que me falte algo), debe cambiarlo aCROSS JOIN(producto cartesiano completo) y luego agregar unaWHEREcláusula como:WHERE ((s.name = t.name) OR (s.name is null and t.name is null)) AND ((s.city = t.city) OR (s.city is null and t.city is null))fuente
Algo como esto funcionará. No sé sobre rendimiento, así que haz algunas pruebas.
fuente
El uso
count(*) over(partition by...)proporciona un medio simple y eficiente para localizar repeticiones no deseadas, mientras que también enumera todas las filas afectadas y todas las columnas deseadas:Mientras que las versiones más recientes de RDBMS son compatibles con
count(*) over(partition by...)MySQL V 8.0, se introdujeron "funciones de ventana", como se ve a continuación (en MySQL 8.0)db <> violín aquí
fuente
Un poco tarde para el juego en esta publicación, pero encontré que esta manera es bastante flexible / eficiente
fuente
Tienes que unir cosas por ti mismo y hacer coincidir el nombre y la ciudad. Luego, agrupe por conteo.
fuente
Dada una tabla de preparación con 70 columnas y solo 4 que representan duplicados, este código devolverá las columnas ofensivas:
.
fuente