2011-07-01 72 views
4
PID  VALUE 
3  1 
4  3 
1  9 
1  3 

如何選擇行(S)多行有兩個 3和9?我試圖SELECT與WHERE

選擇PID從表下value = 3 VALUE = 9

所以,我得到類似下面,相反,我得到一個空集。

PID  
1  

PID 4不應包含在結果中,因爲它沒有價值9

+0

使用或,而不是:) – Karolis

+3

哇人真的不會閱讀這些問題的實際意義嗎?我會使用'PID by group','where value in(3,9)'和'count count(*)= 2'。 –

+0

驚人的有多少人不知道「兩者」的含義。雖然,公平地說,OP使用「行」這個詞是有誤導性的。 –

回答

8

WHERE子句可以從給定表一次只能評估對一個行條件。你不能讓一個條件跨越多行。

但是,您可以使用自加入將來自同一個表的多個行匹配到結果集的一行中,因此您可以應用一個涉及兩者的條件。

SELECT t1.pid 
FROM table t1 JOIN table t2 ON t1.pid=t2.pid 
WHERE t1.value = 3 AND t2.value = 9; 

另一種解決方案是使用GROUP BY和計數不同值:

SELECT t.pid 
FROM table t 
WHERE t.value IN (3,9) 
GROUP BY t.pid 
HAVING COUNT(DISTINCT t.value) = 2; 
+1

+1,我忘了DISTINCT。去吧。 –

+0

好的答案 - 問題不夠詳細,但如果表 –

+0

中的數據量較大,我會採用GROUP BY方法進行解決,因此答案將會更改,因爲第一個方法不能保證連接順序;即t1.value可以是9,t2.value可以是3. –

1

這一點,我認爲是沿着你追求的線條多了幾分:

select PID from table 
where VALUE IN (3, 9) 
group by PID 
having count(*) = 2 

基本上,這會查找具有3或9的條目,將它們組合在一起,並只返回具有2的計數的條目。我假設在這裏(也許不正確),只有只有是每個PID一個3和一個9。

+1

對,這通常不是一個安全的假設。如果兩行的值均爲9,則COUNT(*)將返回2,即使沒有行的值爲3. –

+0

公平性不錯,仍然應該給OP一個大方向。我會使用DISTINCT修正它,但該解決方案已經提出,所以我會保持原樣。 –

+1

是的,這取決於表格。如果對(pid,value)有一個UNIQUE約束,那麼你的解決方案就可以正常工作。 –

0

除了'group by'之外,您還可以考慮'select distinct'來返回一組獨特的pid。