如何选择列值不明显的每一行

Gra*_*per 137 sql sql-server sql-server-2008

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

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

CustomerName     EmailAddress
Aaron            aaron@gmail.com
Christy          aaron@gmail.com
Jason            jason@gmail.com
Eric             eric@gmail.com
John             aaron@gmail.com
Run Code Online (Sandbox Code Playgroud)

我需要查询返回:

Aaron            aaron@gmail.com
Christy          aaron@gmail.com
John             aaron@gmail.com
Run Code Online (Sandbox Code Playgroud)

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

select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1
Run Code Online (Sandbox Code Playgroud)

Ser*_*gan 232

这比以下EXISTS方式快得多:

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
Run Code Online (Sandbox Code Playgroud)

  • 此处使用“HAVING”而不是第二个“SELECT...WHERE”会导致这是一个单个查询,而不是多次执行第二个“SELECT...WHERE”调用的第二个选项。在此处查看更多信息:/sf/ask/647727111/ (5认同)
  • 嘿,我知道这个答案已经有 7 年历史了,但如果你还在,你介意解释一下它是如何工作的吗?也解决了我的问题! (2认同)

小智 45

您的查询不正确的是您通过电子邮件和名称进行分组,这组合了每组唯一的电子邮件和名称组合在一起,因此

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com
Run Code Online (Sandbox Code Playgroud)

被视为3个不同的组,而不是所有属于1个单独的组.

请使用下面给出的查询:

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你还包括一个关于原始查询错误的解释,与接受的答案不同. (17认同)

Mar*_*arc 12

怎么样

SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)
Run Code Online (Sandbox Code Playgroud)


Nis*_*sar 9

select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
Run Code Online (Sandbox Code Playgroud)


Cha*_*had 6

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

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

  • CTE 版本 +1 我们不应该在代码中重复自己,如果不需要的话,为什么要在 SQL 中重复自己呢。 (2认同)
  • 我使用 _count 作为计数列(超过 num)。当列与 _default、_type、_sum 等 SQL 关键字发生冲突时,我始终使用下划线。 (2认同)