【问题标题】:Finding duplicates on one column using select where in SQL Server 2008在 SQL Server 2008 中使用 select where 在一列上查找重复项
【发布时间】:2020-03-04 01:21:11
【问题描述】:

我正在尝试从表中选择一列中有重复项但也基于另一列限制行的行。它似乎无法正常工作。

select Id,Terms from QueryData 
where Track = 'Y' and Active = 'Y'
group by Id,Terms
having count(Terms) > 1

如果我删除 where 它可以正常工作,但我需要将其限制为仅这些行。

ID      Terms     Track    Active
100     paper     Y        Y
200     paper     Y        Y
100     juice     Y        Y
400     orange    N        N
1000    apple     Y        N

理想情况下,查询应该返回前 2 行。

【问题讨论】:

  • 我认为一些示例数据将有助于说明您的问题...我注意到您按 Id 分组,此列在此表中不是唯一的吗?
  • 此表没有索引,将提供上面的示例

标签: sql sql-server-2008 duplicates


【解决方案1】:
SELECT Id, Terms, Track, Active
FROM QueryData
WHERE Terms IN (
                SELECT Terms 
                FROM QueryData
                WHERE Track = 'Y' and Active = 'Y' 
                GROUP BY Terms
                HAVING COUNT(*) > 1
                )

SQLFiddle上的演示

数据:

ID      Terms     Track    Active
100     paper     Y        Y
200     paper     Y        Y
100     juice     Y        Y
400     orange    N        N
1000    apple     Y        N

结果:

Id      Terms     Track    Active
100     paper     Y        Y
200     paper     Y        Y

【讨论】:

    【解决方案2】:

    不要完全明白你在做什么。您在 having 中使用 count(Terms) 但是 Terms 在您的 select 子句中。这意味着对于每条记录,count(Terms) 将为 1。可能您必须从 select 列表中排除 Terms。 老实说,我复制了您的表格和查询,但它不起作用。

    this 可能就是你要找的东西(?):

    select Id, count(Terms) from QueryData 
    where Track = 'Y' and Active = 'Y'
    group by Id
    having count(Terms) > 1
    

    【讨论】:

      【解决方案3】:

      这将返回所有符合条件的重复项:

      select Terms
      from QueryData
      where Track = 'Y' and Active = 'Y'
      group by Terms
      having count(*) > 1
      

      http://sqlfiddle.com/#!3/18a57/2

      如果您想了解这些条款的所有详细信息,可以加入此结果。

      ;with dups as (
        select Terms
        from QueryData
        where Track = 'Y' and Active = 'Y'
        group by Terms
        having count(*) > 1
      )
      select
        qd.ID, qd.Terms, qd.Track, qd.Active
      from 
        QueryData qd join
        dups d on qd.terms = d.terms
      

      http://sqlfiddle.com/#!3/18a57/5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2013-02-02
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多