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
name
ocity
contienennull
, no se informarán en la consulta externa, pero se compararán en la consulta interna.null
entonces (a menos que me falte algo), debe cambiarlo aCROSS JOIN
(producto cartesiano completo) y luego agregar unaWHERE
clá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