2011-05-12 78 views
1

爲什麼這給出一個空的結果?我試圖獲得不是監督員的一組員工的最小值,最大值和平均值。職員表的SQL聚合不產生結果

SELECT MIN(salary), MAX(salary), AVG(salary) 
FROM employee 
WHERE ssn NOT IN 
(SELECT superssn FROM employee) 

部分

SSN  SUPERSSN 
--------- --------- 
888665555 
333445555 888665555 
987654321 888665555 
987987987 987654321 
123456789 333445555 
999887777 987654321 
666884444 333445555 
453453453 333445555 
+0

什麼'select count(ssn)FROM employee WHERE ssn NOT IN(SELECT superssn FROM employee)'給你 – 2011-05-12 04:50:35

回答

2

您需要從內部查詢中排除空值。否則,外部查詢將針對其中一個列表值爲NULL並且該比較不返回任何內容的列表進行檢查。所以,正確的查詢應該是類似的。

SELECT MIN(salary), MAX(salary), AVG(salary) 
FROM employee 
WHERE ssn NOT IN 
(SELECT superssn FROM employee where superssn IS NOT NULL) 
+1

如果你選擇你的代碼並按'{}'你的代碼將被格式化 – 2011-05-12 04:52:17

2

這就是爲什麼NOT EXISTS爲列表語義正確,更可靠的

SELECT MIN(salary), MAX(salary), AVG(salary) 
FROM employee E 
WHERE NOT EXISTS (SELECT * FROM employee E2 WHERE E.ssn = E2.superssn) 

任何NULL在NOT總會給假感謝布爾邏輯。你有一個NULL superssn值。