Подзапрос SQL больше / меньше операторов - PullRequest
0 голосов
/ 06 мая 2019

Я сейчас пытаюсь просто запросить jobname и jobid через функцию GROUP BY. Я использую подзапрос с COUNT(jobID) >2. Несмотря на это, выходные данные по-прежнему отображают значения 2. Я понимаю, что могу использовать HAVING с этим, но мне искренне интересно, почему это не работает.

SELECT EmployeeType.jobName, COUNT(Employee.JobID) FROM Employee, EmployeeType WHERE (Employee.jobID = EmployeeType.jobID) AND (SELECT COUNT(Employee.jobID) FROM Employee) > 2 GROUP BY EmployeeType.JobName;

Выход: enter image description here

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Ваш подзапрос не связан с внешним запросом.Когда этот подзапрос выполняется, он просто запрашивает SELECT COUNT(Employee.jobID) FROM Employee для каждой оцениваемой записи.Значение этого запроса больше 2, поэтому каждая запись включается.

Если я понимаю, что вы пытаетесь сделать, вам просто нужно использовать предложение HAVING.

SELECT EmployeeType.jobName, COUNT(Employee.jobID)
FROM Employee, EmployeeType
WHERE Employee.jobID = EmployeeType.jobID
GROUP BY EmployeeType.JobName
HAVING COUNT(Employee.jobID) > 2
1 голос
/ 06 мая 2019

Не то, чтобы Майкл отвечал неправильно, но использование запятых в предложении FROM полностью не рекомендуется.Итак, я даю альтернативные ответы.

Во-первых, правильный способ написания запроса в XXI веке:

SELECT et.jobName, COUNT(*)
FROM Employee e JOIN
     EmployeeType et
     ON e.jobID = et.jobID
GROUP BY et.JobName
HAVING COUNT(e.jobID) > 2;

Также обратите внимание на использование псевдонимов таблиц.

Если JobName уникален в EmployeeType, то вы можете использовать коррелированный подзапрос:

select et.jobName,
       (select count(*)
        from employee e
        where e.jobId = et.jobId
       ) as cnt
from employeeType;

Затем вы будете использовать подзапрос для фильтрации по нужным подсчетам..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...