【问题标题】:select those fields that has more than one entry [duplicate]选择那些具有多个条目的字段[重复]
【发布时间】:2013-04-13 17:37:08
【问题描述】:

我不明白如何编写仅显示这些条目的简单 sql 语句 不止一次出现。

例如

NodeID  Number

0       12
1       12
2       12
0       13
1       13
0       14
1       15
2       16
1       17

从表格中选择nodeIDnumber,其中数字出现不止一次且具有不同的nodeID

结果:

NodeID  Number
0       12
1       12
2       12
0       13
1       13

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT  a.*
    FROM    TableName a
            INNER JOIN
            (
                SELECT  Number
                FROM    TableName
                GROUP   BY Number
                HAVING  COUNT(*) > 1
            ) b ON a.Number = b.Number
    

    另一种方法是使用EXISTS

    SELECT  a.*
    FROM    TableName a
    WHERE   EXISTS
            (
                SELECT  1
                FROM    TableName b
                WHERE   a.Number = b.Number
                GROUP   BY Number
                HAVING  COUNT(*) > 1
            ) 
    

    【讨论】:

    • 即使12 重复出现nodeID sqlfiddle.com/#!2/97d68/1/0 也会选择记录。认为我误解了这个问题?
    • @Ejay 答案基于上面的示例。你有关于重复的观点,但如果 OP 对每个组合都有唯一约束,则可以避免这种情况。
    • @Ejay 这是您的解决方案示例,sqlfiddle.com/#!2/97d68/4
    • 太好了 :) 您的解决方案确实解决了 OP 的问题。我只是对重复案例感到好奇
    【解决方案2】:

    试试这个

    SELECT NodeID , Number FROM TableName WHERE Number IN
    (SELECT Number FROM TableName  GROUP BY Number HAVING  COUNT(*) > 1)
    

    【讨论】:

      【解决方案3】:

      你也可以使用EXISTS而不使用GROUP BY

      SELECT nodeid, 
             number 
      FROM   Table1 t1 
      WHERE  EXISTS(SELECT 1 
                    FROM   Table1 t2 
                    WHERE  t1.number = t2.number 
                           AND t1.nodeid <> t2.nodeid) 
      

      DEMO

      【讨论】:

        【解决方案4】:

        我的第一个想法是像下面这样进行自我加入,但它不起作用,因为分组发生在之后。

        SELECT T1.NodeId, T2.Number, COUNT(T2.Number) C 从表 T1 INNER JOIN 表 T2 使用(数字) 其中 C > 1 GROUP BY T2.Number

        因此您必须先进行分组选择,然后进行连接:

        SELECT NodeId, Number
        FROM Table T1
        INNER JOIN (
             SELECT Number, COUNT(Number) C
             FROM Table
            WHERE C > 1
            GROUP BY Number
        ) T2 USING(Number)
        

        【讨论】:

          猜你喜欢
          • 2021-03-09
          • 2018-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-03
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多