【问题标题】:How to Select Every Row Where Column Value is NOT Distinct如何选择列值不不同的每一行
【发布时间】:2012-10-20 05:22:38
【问题描述】:

我需要运行一个 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

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:
    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
    
    • 按标题排序

    【讨论】:

      【解决方案2】:

      而不是在 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 可以重复。

      【讨论】:

        【解决方案3】:

        这比EXISTS方式快得多:

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

        【讨论】:

        • 嘿,我知道这个答案已经有 7 年历史了,但是如果你还在,你介意解释一下它是如何工作的吗?也解决了我的问题!
        • 在此处使用HAVING 而不是第二个SELECT...WHERE 会导致这是一个查询,而不是执行第二个SELECT...WHERE 调用多次的第二个选项。在此处查看更多信息:stackoverflow.com/q/9253244/550975
        • 我收到了臭名昭著的[EmailAddress] must appear in the GROUP BY clause or be used in an aggregate function 错误。是唯一的解决方法 - 编辑sql_mode?
        • 实际上,您可以在查询的底部添加GROUP BY [EmailAddress],这应该会为您完成...您也可以尝试在 [ EmailAddress] 但那更 hacky...
        【解决方案4】:
        select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
        

        【讨论】:

        • 小幅改进以将计数显示为“dups”:从客户组中选择 CustomerName,count(1) 作为 dups,由具有 count(1) > 1 的 CustomerName `
        【解决方案5】:

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

        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)
        

        【讨论】:

        • 我喜欢你还提供了关于原始查询有什么问题的解释,这与接受的答案不同。
        【解决方案6】:

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

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

        【讨论】:

        • +1 用于 CTE 版本我们不应该在代码中重复自己,如果我们不需要再在 SQL 中重复自己。
        • 我使用 _count 作为计数列(超过 num)。当列碰巧与 _default、_type、_sum 等 SQL 关键字发生冲突时,我始终使用下划线。
        【解决方案7】:

        怎么样

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-08
          • 1970-01-01
          • 1970-01-01
          • 2018-12-09
          • 1970-01-01
          • 2017-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多