2017-02-22 34 views
0

我試圖從下面的表從只有那些誰在工作PNO 3,但得到ESSN值不在10SQL 2 WHERE爲同一列的條件

所以結果woud是"666884444"

我試圖做到像

SELECT Essn 
FROM WORKS_ON 
WHERE Pno = 3 and Pno != 10; 

但不能得到正確的結果

WORKS_ON

---Essn-----------Pno-----------Hours---- 
"123456789"  "1"   "32.5" 
"123456789"  "2"   "7.5" 
"666884444"  "3"   "40" 
"453453453"  "1"   "20" 
"453453453"  "2"   "20" 
"333445555"  "2"   "10" 
"333445555"  "3"   "10" 
"333445555"  "10"   "10" 
"333445555"  "20"   "10" 
"999887777"  "30"   "30" 
"999887777"  "10"   "10" 
"987987987"  "10"   "35" 
"987987987"  "30"   "5" 
"987654321"  "30"   "20" 
"987654321"  "20"   "15" 
"888665555"  "20"   NULL 
+1

是否使用的是RDBMS? – Petaflop

+2

我不認爲我理解一列的值如何可以是3和10. – Deltharis

回答

3

您的WHERE-Condition不起作用,因爲它只是單獨比較每行的值。 有很多方法來實現這一點,這是我的第一個想法:

SELECT DISTINCT Essn 
FROM WORKS_ON 
WHERE Pno = 3 AND Essn NOT IN (SELECT Essn FROM WORKS_ON WHERE Pno = 10); 
+1

這個,除了'Pno'似乎是一個字符串,不是數字 – Petaflop

+0

是的,依賴於RDBMS。在SQL Server上它肯定會工作(隱式轉換) – RoundFour

+0

,但我們仍然不知道,所以它可能不適用於其他dbms – Petaflop

0

我想你了你想和group byhaving什麼:

SELECT Essn 
FROM WORKS_ON 
GROUP BY Essn 
HAVING SUM(CASE WHEN Pno = 3 THEN 1 ELSE 0 END) > 0 AND -- has 3 
     SUM(CASE WHEN Pno = 10 THEN 1 ELSE 0 END) = 0;  -- does not have 10 
+0

我不認爲這會工作,OP **似乎**有字符串不是整數。 – Woot4Moo

+0

@ Perse-Fisher。 。 。如果這些值是字符串,那麼在'WHEN'比較中使用單引號。 –

0
SELECT Essn 
FROM WORKS_ON 
WHERE Pno = "3" 

這本身只返回Pno列的Essn有3

爲什麼你需要另一個WHERE Pno != 10