2011-05-12 54 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值。