2014-10-28 59 views
0

我不知道如何真正尋找這個..SQL,其中具體的列值出現

可以說我有一個簡單的表像這樣

ID  Type 
1  0 
1  1 
2  1 
3  0 
4  0 
4  1 

我怎麼會選擇所有的ID具有一種0和1?

+1

'SELECT ID FROM table WHERE Type IN(0,1)' – Danijel 2014-10-28 23:24:01

+1

@Danijel這將選擇該示例表中的所有內容。 OP只需要1和4. – ydaetskcoR 2014-10-28 23:24:36

回答

4
SELECT id,type 
FROM t 
GROUP BY id 
HAVING SUM(type=0)>0 
AND SUM(type=1)>0 

你只需按ID,比有你使用後聚集篩選檢查0和1

+1

爲了解釋,這將數據分組爲每個ID的集合,然後計算每個集合中匹配表達式「type = 0」和「type = 1」的行數 - 只要兩個這些表達式對於給定的組是真實的,它在結果集中返回該組。 – Polynomial 2014-10-28 23:27:10

+0

不會使用索引.... – winmutt 2014-10-30 03:16:03

2

有相當的昂貴,並且查詢不能打鍵。

SELECT ID FROM foo AS foo0 JOIN foo AS foo1 USING (ID) WHERE foo0.Type=0 AND foo1.Type=1 GROUP BY foo0.id. 
1

這樣做的一個更普遍的方法是對每個需要測試的值使用CASE列與ID列上的GROUP BY組合。這意味着,如果您有n個條件可供測試,那麼您將有一列指示是否滿足給定ID的每個條件。然後,HAVING條件變得微不足道,您可以像使用多列過濾器一樣使用它,或者使用分組作爲子查詢,代碼看起來更簡單,邏輯變得更容易遵循。

SELECT id, Type0,Type1 
FROM (
    SELECT id, 
     Type0 = max(CASE WHEN type = 0 THEN TRUE END) 
     , Type1 = max(CASE WHEN type = 1 THEN TRUE END) 
    FROM t 
    GROUP BY id 
    ) pivot 
WHERE Type0 = TRUE and Type1 = TRUE 
+0

不會使用索引。 – winmutt 2014-10-30 03:15:36