SQL-агрегат не дает результатов - PullRequest
1 голос
/ 12 мая 2011

Почему это дает пустой результат?Я пытаюсь получить минимальное, максимальное и среднее число сотрудников, которые не являются руководителями.

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

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Вот почему 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 IN всегда будет давать ложь благодаря логической логике.У вас есть значение NULL superssn.

2 голосов
/ 12 мая 2011

Вам необходимо исключить пустые значения из внутреннего запроса. В противном случае внешний запрос проверяет список, в котором одно из значений списка равно NULL, и это сравнение ничего не возвращает. Итак, правильный запрос должен быть примерно таким.

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