188

我需要运行一个 select 语句,它返回列的值不不同的所有行(例如 EmailAddress)。

例如,如果表格如下所示:

CustomerName     EmailAddress
Aaron            aaron@gmail.com
Christy          aaron@gmail.com
Jason            jason@gmail.com
Eric             eric@gmail.com
John             aaron@gmail.com

我需要查询返回:

Aaron            aaron@gmail.com
Christy          aaron@gmail.com
John             aaron@gmail.com

我已经阅读了很多帖子并尝试了不同的查询,但无济于事。我认为应该工作的查询如下。有人可以提出替代方案或告诉我我的查询可能有什么问题吗?

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

7 回答 7

319

这比以下EXISTS方式快得多:

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
于 2013-10-11T20:26:51.373 回答
63

您的查询不正确的是您按电子邮件和姓名进行分组,这形成了一组每个独特的电子邮件和姓名组合在一起,因此

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com

被视为 3 个不同的组,而不是全部属于 1 个单独的组。

请使用下面给出的查询:

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
于 2012-10-30T19:49:14.977 回答
21
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
于 2013-07-03T06:29:21.263 回答
12

How about

SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)
于 2012-10-30T19:34:08.923 回答
9

只是为了好玩,这是另一种方式:

;with counts as (
    select CustomerName, EmailAddress,
      count(*) over (partition by EmailAddress) as num
    from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1
于 2012-10-30T19:38:15.653 回答
4

而不是在 where 条件下使用子查询,这会增加大量记录的查询时间。

我建议使用 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是可能的。

于 2016-09-19T05:29:52.347 回答
0
SELECT        Title, Id
FROM            dbo.TblNews
WHERE        (Title IN
      (SELECT  Title 
FROM dbo.TblNews AS TblNews_1
GROUP BY Title
HAVING (COUNT(*) > 1)))
ORDER BY Title
  • 按标题排序
于 2021-04-11T13:33:07.277 回答