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