我目前正在尝试通过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;
答案 0 :(得分:3)
您的子查询与外部查询没有任何关系。当执行该子查询时,它仅查询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 :(得分:1)
并不是迈克尔的答案是错误的,但是应该完全避免在FROM
子句中使用逗号。因此,我提供了其他答案。
首先,在21世纪编写查询的正确方法是:
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;
然后,您将使用子查询来过滤所需的计数。