【问题标题】:Select rows that do NOT have a DISTINCT value选择没有 DISTINCT 值的行
【发布时间】:2014-06-12 08:49:35
【问题描述】:

有人可以建议一种方法来选择没有唯一值的列吗?

如果我有 5 条记录,其中 1 条记录的 CustNo = 7,1 条记录的 CustNo = 9,3 条记录的 CustNo = 11,我只想选择 CustNo = 11 的三行

【问题讨论】:

  • 为了将来参考,如果您提供表的架构以及您已经尝试过的内容,则更容易为您提供有用的答案。
  • 注意:对于下面的答案,他们没有处理 NULL CustNo... 但假设在大多数情况下不会发生这种情况可能相当安全。

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


【解决方案1】:

要显示所有不明确的行,您需要这样的子查询

select * from CustDetails
WHERE CustNo IN (SELECT CustNo from CustDetails 
                 group by CustNo 
                 having count(CustNo) > 1)

这是相同的 sql fiddle

http://sqlfiddle.com/#!3/1c9a4/4

【讨论】:

  • CustDetails 可能包含超过 1 列,从而导致 IN 出现错误。 (因为 IN 只需要一列)
  • @SimchaKhabinsky 很好,问题中没有提到。我现在已经编辑了答案
【解决方案2】:

这将查找在 CustNo 中有重复的记录并计算它们的数量

Select CustNo, Count(*) From Table1
Group By CustNo
Having Count(*) > 1

另一种完整解决方案的方法(仅获取具有重复项的完整记录),使用组和加入

Select t1.*
From Table1  t1 inner join 
    (Select CustNo cn From Table1
     Group By CustNo
     Having Count(*) > 1) t2 On t1.CustNo = t2.cn

【讨论】:

    【解决方案3】:

    这会检索所有重复记录:

    SELECT CustNo FROM MyTable Group By CustNo Having COUNT(*) > 1
    

    【讨论】:

    • 我需要整行。谢谢。
    【解决方案4】:

    只需执行 SELECT/GROUP BY 将只返回一行用于 CustNo 不唯一的记录。但是,在子查询中实现它应该这样做。

    如果我正确理解您的问题,那么这将返回 CustomerTable 中 CustNo 不唯一的行:

    SELECT *
    FROM CustomerTable
    WHERE CustNo IN (
        SELECT CustNo
        FROM CustomerTable
        GROUP BY CustNo
        HAVING COUNT(*) > 1)
    

    【讨论】:

    • 这就是票。谢谢。
    【解决方案5】:

    如果您需要获取重复行的完整行,请使用窗口函数:

    select t.*
    from (select t.*, count(*) over (partition by CustNo) as cnt
          from table t
         ) t
    where cnt > 1;
    

    【讨论】:

    • 像魅力一样工作。谢谢。
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2020-11-03
    • 2022-10-24
    • 2023-04-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多