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
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
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,我忘了DISTINCT。去吧。 –
好的答案 - 問題不夠詳細,但如果表 –
中的數據量較大,我會採用GROUP BY方法進行解決,因此答案將會更改,因爲第一個方法不能保證連接順序;即t1.value可以是9,t2.value可以是3. –
這一點,我認爲是沿着你追求的線條多了幾分:
select PID from table
where VALUE IN (3, 9)
group by PID
having count(*) = 2
基本上,這會查找具有3或9的條目,將它們組合在一起,並只返回具有2的計數的條目。我假設在這裏(也許不正確),只有只有是每個PID一個3和一個9。
對,這通常不是一個安全的假設。如果兩行的值均爲9,則COUNT(*)將返回2,即使沒有行的值爲3. –
公平性不錯,仍然應該給OP一個大方向。我會使用DISTINCT修正它,但該解決方案已經提出,所以我會保持原樣。 –
是的,這取決於表格。如果對(pid,value)有一個UNIQUE約束,那麼你的解決方案就可以正常工作。 –
除了'group by'之外,您還可以考慮'select distinct'來返回一組獨特的pid。
使用或,而不是:) – Karolis
哇人真的不會閱讀這些問題的實際意義嗎?我會使用'PID by group','where value in(3,9)'和'count count(*)= 2'。 –
驚人的有多少人不知道「兩者」的含義。雖然,公平地說,OP使用「行」這個詞是有誤導性的。 –