Как выбрать каждую строку, где значение столбца НЕ ОТНОСЯТСЯ

Мне нужно выполнить оператор выбора, который возвращает все строки, где значение столбца не отличается (например, 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

Ответ 1

Это значительно быстрее, чем способ EXISTS:

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

Ответ 2

То, что неверно в вашем запросе, состоит в том, что вы группируете по электронной почте и имени, которое формирует группу каждого уникального набора адресов электронной почты и имени, вместе взятых и, следовательно,

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)

Ответ 3

Как насчет

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

Ответ 4

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

Ответ 5

Просто для удовольствия, здесь по-другому:

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

Ответ 6

Вместо того, чтобы использовать вспомогательные запросы, в которых условие, которое увеличит время запроса, когда записи находятся в огромном размере.

Я бы предложил использовать 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.

Ответ 7

ВЫБЕРИТЕ [EmailAddress], [CustomerName] ИЗ [Клиентов] ГДЕ [EmailAddress] IN (ВЫБЕРИТЕ [EmailAddress] ИЗ [Клиентов] GROUP BY [EmailAddress] HAVING COUNT (*)> 1);

Ответ 8

Ну, есть небольшое изменение, чтобы найти не четкие строки..

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