2013-04-20 110 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)