una todas solo seleccionar repetido registro ocultar mostrar las filas excluir excepto convertir consulta columnas columna campo sql sql-server sql-server-2008

todas - seleccionar todo excepto sql server



Cómo seleccionar cada fila donde el valor de la columna NO es distintivo (7)

Necesito ejecutar una instrucción select que devuelve todas las filas donde el valor de una columna no es distinto (por ejemplo, EmailAddress).

Por ejemplo, si la tabla se ve a continuación:

CustomerName EmailAddress Aaron [email protected] Christy [email protected] Jason [email protected] Eric [email protected] John [email protected]

Necesito la consulta para regresar:

Aaron [email protected] Christy [email protected] John [email protected]

He leído muchas publicaciones y he intentado diferentes consultas sin resultado. La consulta que creo que debería funcionar es la siguiente. ¿Puede alguien sugerir una alternativa o decirme qué puede estar mal con mi consulta?

select EmailAddress, CustomerName from Customers group by EmailAddress, CustomerName having COUNT(distinct(EmailAddress)) > 1


Bueno, hay un ligero cambio para encontrar las filas no distintas ...

SELECCIONE EmailAddress, CustomerName FROM Clientes WHERE EmailAddress NOT IN (SELECCIONE EmailAddress FROM Clientes GROUP BY EmailAddress TENIENDO COUNT (*)> 1)


En lugar de usar subconsultas en las que la condición aumentará el tiempo de consulta donde los registros están en gran cantidad.

Sugeriría utilizar Inner Join como la mejor opción para este problema.

Teniendo en cuenta la misma tabla, esto podría dar el resultado

SELECT EmailAddress, CustomerName FROM Customers as a Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress

Para obtener mejores resultados, le sugiero que use CustomerID o cualquier campo exclusivo de su tabla. La duplicación de CustomerName es posible.


Esto es significativamente más rápido que el modo EXISTS :

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)


Lo que es incorrecto con su consulta es que se está agrupando por correo electrónico y nombre, que forma un grupo de cada conjunto único de correo electrónico y nombre combinados y por lo tanto

aaron and [email protected] christy and [email protected] john and [email protected]

se tratan como 3 grupos diferentes, más bien todos pertenecen a 1 solo grupo.

Utilice la consulta como se indica a continuación:

select emailaddress,customername from customers where emailaddress in (select emailaddress from customers group by emailaddress having count(*) > 1)


Qué tal si

SELECT EmailAddress, CustomerName FROM Customers a WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)


Solo por diversión, aquí hay otra forma:

;with counts as ( select CustomerName, EmailAddress, count(*) over (partition by EmailAddress) as num from Customers ) select CustomerName, EmailAddress from counts where num > 1


select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1