2013-04-20 26 views
0

我不明白如何编写一个简单的sql语句,它只显示那些不止一次出现的条目 。选择那些有多个条目的字段

e.x.

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 

回答

3
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 
     ) 
+0

这种选择即使'12'与重复'nodeID' http://www.sqlfiddle.com/#!2出现记录/ 97d68/1/0。认为我误解了这个问题? – Ejaz 2013-04-20 11:18:59

+0

@Ejay答案基于上面的例子。您对重复有一点意见,但是如果OP对每个组合都有唯一的约束,则可以避免这种情况。 – 2013-04-20 11:26:58

+0

@Ejay这里是你的解决方案,例如http://www.sqlfiddle.com/#!2/97d68/4 – 2013-04-20 11:28:08

0

试试这个

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

你也可以使用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

0

我的第一个想法是做一个自我加入像下面,但它不会工作,因为分组发生之后。

SELECT T1.NodeId,T2.Number,COUNT(T2.Number)C FROM T1表 INNER JOIN表T2 USING(编号) WHERE 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)