Ответ 1
Это значительно быстрее, чем способ EXISTS
:
SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
(SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
Мне нужно выполнить оператор выбора, который возвращает все строки, где значение столбца не отличается (например, EmailAddress).
Например, если таблица выглядит следующим образом:
CustomerName EmailAddress
Aaron [email protected]
Christy [email protected]
Jason [email protected]
Eric [email protected]
John [email protected]
Мне нужен запрос для возврата:
Aaron [email protected]
Christy [email protected]
John [email protected]
Я прочитал много постов и пробовал разные запросы безрезультатно. Запрос, который я считаю, должен работать ниже. Может кто-нибудь предложить альтернативу или сказать, что может быть не так с моим запросом?
select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1
Это значительно быстрее, чем способ EXISTS
:
SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
(SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
То, что неверно в вашем запросе, состоит в том, что вы группируете по электронной почте и имени, которое формирует группу каждого уникального набора адресов электронной почты и имени, вместе взятых и, следовательно,
aaron and [email protected]
christy and [email protected]
john and [email protected]
рассматриваются как 3 разные группы, а все принадлежат одной отдельной группе.
Пожалуйста, используйте запрос, как показано ниже:
select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
Как насчет
SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
Просто для удовольствия, здесь по-другому:
;with counts as (
select CustomerName, EmailAddress,
count(*) over (partition by EmailAddress) as num
from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1
Вместо того, чтобы использовать вспомогательные запросы, в которых условие, которое увеличит время запроса, когда записи находятся в огромном размере.
Я бы предложил использовать Inner Join как лучший вариант этой проблемы.
Учитывая ту же таблицу, это может дать результат
SELECT EmailAddress, CustomerName FROM Customers as a
Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress
Для получения более качественных результатов я предлагаю вам использовать CustomerID
или любое уникальное поле вашей таблицы. Возможно дублирование CustomerName
.
ВЫБЕРИТЕ [EmailAddress], [CustomerName] ИЗ [Клиентов] ГДЕ [EmailAddress] IN (ВЫБЕРИТЕ [EmailAddress] ИЗ [Клиентов] GROUP BY [EmailAddress] HAVING COUNT (*)> 1);
Ну, есть небольшое изменение, чтобы найти не четкие строки..
SELECT EmailAddress, CustomerName FROM Customers WHERE EmailAddress NOT IN
(SELECT EmailAddress FROM Customers GROUP BY EmailAddress HAVING COUNT(*) > 1)